From 4540061936ff85b4dd70024da316916b7a1524f0 Mon Sep 17 00:00:00 2001 From: akshayaurora Date: Tue, 15 Nov 2011 19:59:11 +0530 Subject: [PATCH 1/4] fix camera frame updation --- kivy/uix/camera.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kivy/uix/camera.py b/kivy/uix/camera.py index cf461583b..4ef13f142 100644 --- a/kivy/uix/camera.py +++ b/kivy/uix/camera.py @@ -89,6 +89,13 @@ class Camera(Image): resolution=self._on_index) self._on_index() + def on_frame(self, *l): + # texture needs to know somehow that it has changed + # but in this case the texture(refference/address) + # remains the same, so force it to change + self.texture = None + self.texture = self._camera._texture + def _on_index(self, *largs): self._camera = None if self.index < 0: @@ -98,6 +105,7 @@ class Camera(Image): self._camera.bind(on_load=self._camera_loaded) if self.play: self._camera.start() + self._camera.bind(on_frame=self.on_frame) def _camera_loaded(self, *largs): self.texture = self._camera.texture From 717ffa1aa90f54af3c7fdb5a88bb536b6a9e5cba Mon Sep 17 00:00:00 2001 From: akshayaurora Date: Wed, 16 Nov 2011 23:12:06 +0530 Subject: [PATCH 2/4] Try to trigger on_frame only on successfull frame retrieval from camera Only gstreamer seems to suppport this --- kivy/core/camera/__init__.py | 3 --- kivy/core/camera/camera_gstreamer.py | 4 +++- kivy/core/camera/camera_opencv.py | 8 ++++++++ kivy/core/camera/camera_videocapture.py | 2 ++ kivy/uix/camera.py | 6 +----- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/kivy/core/camera/__init__.py b/kivy/core/camera/__init__.py index abe08334f..399fa6d43 100644 --- a/kivy/core/camera/__init__.py +++ b/kivy/core/camera/__init__.py @@ -10,7 +10,6 @@ __all__ = ('CameraBase', 'Camera') import sys -from kivy.clock import Clock from kivy.event import EventDispatcher from kivy.logger import Logger from kivy.core import core_select_lib @@ -101,8 +100,6 @@ class CameraBase(EventDispatcher): def start(self): '''Start the camera acquire''' self.stopped = False - Clock.unschedule(self._update) - Clock.schedule_interval(self._update, 1. / 30) def stop(self): '''Release the camera''' diff --git a/kivy/core/camera/camera_gstreamer.py b/kivy/core/camera/camera_gstreamer.py index a3668352d..261c43526 100644 --- a/kivy/core/camera/camera_gstreamer.py +++ b/kivy/core/camera/camera_gstreamer.py @@ -4,7 +4,7 @@ GStreamer Camera: Implement CameraBase with GStreamer __all__ = ('CameraGStreamer', ) - +from kivy.clock import Clock from kivy.graphics.texture import Texture from . import CameraBase @@ -77,7 +77,9 @@ class CameraGStreamer(CameraBase): for x in self._decodebin.src_pads(): for cap in x.get_caps(): self._texturesize = (cap['width'], cap['height']) + Clock.schedule_once(self._update) return + Clock.schedule_once(self._update) def start(self): super(CameraGStreamer, self).start() diff --git a/kivy/core/camera/camera_opencv.py b/kivy/core/camera/camera_opencv.py index b280e362c..fa55a32f4 100644 --- a/kivy/core/camera/camera_opencv.py +++ b/kivy/core/camera/camera_opencv.py @@ -9,6 +9,7 @@ OpenCV Camera: Implement CameraBase with OpenCV __all__ = ('CameraOpenCV') from kivy.logger import Logger +from kivy.clock import Clock from kivy.graphics.texture import Texture from . import CameraBase @@ -59,6 +60,13 @@ class CameraOpenCV(CameraBase): # with self.init_camera (but slowly as we'd have to always get a frame). self._resolution = (int(frame.width), int(frame.height)) + #get fps + fps = cv.GetCaptureProperty(self._device, cv.CV_CAP_PROP_FPS) + if fps <= 0: + fps = 30 + Clock.schedule_interval(self._update, .03) + + if not self.stopped: self.start() diff --git a/kivy/core/camera/camera_videocapture.py b/kivy/core/camera/camera_videocapture.py index e952db397..3623493b0 100644 --- a/kivy/core/camera/camera_videocapture.py +++ b/kivy/core/camera/camera_videocapture.py @@ -33,6 +33,8 @@ class CameraVideoCapture(CameraBase): self._device.setResolution(self.resolution[0], self.resolution[1]) except: raise Exception('VideoCapture: Resolution not supported') + from kivy.clock import Clock + Clock.schedule_interval(self._update , .03) def _update(self, dt): data, camera_width, camera_height = self._device.getBuffer() diff --git a/kivy/uix/camera.py b/kivy/uix/camera.py index 4ef13f142..9bced4874 100644 --- a/kivy/uix/camera.py +++ b/kivy/uix/camera.py @@ -90,11 +90,7 @@ class Camera(Image): self._on_index() def on_frame(self, *l): - # texture needs to know somehow that it has changed - # but in this case the texture(refference/address) - # remains the same, so force it to change - self.texture = None - self.texture = self._camera._texture + self.canvas.ask_update() def _on_index(self, *largs): self._camera = None From 428bbf56e5cd67c43d4cbfc21afd390e1a62bcb3 Mon Sep 17 00:00:00 2001 From: akshayaurora Date: Wed, 16 Nov 2011 23:40:53 +0530 Subject: [PATCH 3/4] correct default fps --- kivy/core/camera/__init__.py | 1 - kivy/core/camera/camera_opencv.py | 17 ++++++++++++----- kivy/core/camera/camera_videocapture.py | 15 +++++++++++++-- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/kivy/core/camera/__init__.py b/kivy/core/camera/__init__.py index 399fa6d43..7eb0438de 100644 --- a/kivy/core/camera/__init__.py +++ b/kivy/core/camera/__init__.py @@ -104,7 +104,6 @@ class CameraBase(EventDispatcher): def stop(self): '''Release the camera''' self.stopped = True - Clock.unschedule(self._update) def _update(self, dt): '''Update the camera (internal)''' diff --git a/kivy/core/camera/camera_opencv.py b/kivy/core/camera/camera_opencv.py index fa55a32f4..ce53ab8fc 100644 --- a/kivy/core/camera/camera_opencv.py +++ b/kivy/core/camera/camera_opencv.py @@ -61,11 +61,9 @@ class CameraOpenCV(CameraBase): self._resolution = (int(frame.width), int(frame.height)) #get fps - fps = cv.GetCaptureProperty(self._device, cv.CV_CAP_PROP_FPS) - if fps <= 0: - fps = 30 - Clock.schedule_interval(self._update, .03) - + self.fps = cv.GetCaptureProperty(self._device, cv.CV_CAP_PROP_FPS) + if self.fps <= 0: + self.fps = .03 if not self.stopped: self.start() @@ -91,3 +89,12 @@ class CameraOpenCV(CameraBase): except: Logger.exception('OpenCV: Couldn\'t get image from Camera') + def start(self): + super(CameraOpenCV, self).start() + Clock.unschedule(self._update) + Clock.schedule_interval(self._update, self.fps) + + def stop(self): + super(CameraOpenCV, self).stop() + Clock.unschedule(self._update) + diff --git a/kivy/core/camera/camera_videocapture.py b/kivy/core/camera/camera_videocapture.py index 3623493b0..ec7f740e3 100644 --- a/kivy/core/camera/camera_videocapture.py +++ b/kivy/core/camera/camera_videocapture.py @@ -9,6 +9,7 @@ VideoCapture Camera: Implement CameraBase with VideoCapture __all__ = ('CameraVideoCapture', ) from . import CameraBase +from kivy.clock import Clock try: from VideoCapture import Device @@ -33,8 +34,7 @@ class CameraVideoCapture(CameraBase): self._device.setResolution(self.resolution[0], self.resolution[1]) except: raise Exception('VideoCapture: Resolution not supported') - from kivy.clock import Clock - Clock.schedule_interval(self._update , .03) + self.fps = .03 def _update(self, dt): data, camera_width, camera_height = self._device.getBuffer() @@ -49,3 +49,14 @@ class CameraVideoCapture(CameraBase): # update buffer self._buffer = data self._copy_to_gpu() + + def start(self): + super(CameraVideoCapture, self).start() + Clock.unschedule(self._update) + Clock.schedule_interval(self._update, self.fps) + + def stop(self): + super(CameraVideoCapture, self).stop() + Clock.unschedule(self._update) + + From 8fa70eb1e10cd757fa5e01b138afcb2a24827bb4 Mon Sep 17 00:00:00 2001 From: akshayaurora Date: Thu, 17 Nov 2011 00:13:16 +0530 Subject: [PATCH 4/4] change from on_frame to on_texture and .03 to 1/30 --- kivy/core/camera/__init__.py | 6 +++--- kivy/core/camera/camera_opencv.py | 2 +- kivy/core/camera/camera_videocapture.py | 2 +- kivy/uix/camera.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/kivy/core/camera/__init__.py b/kivy/core/camera/__init__.py index 7eb0438de..f8c368763 100644 --- a/kivy/core/camera/__init__.py +++ b/kivy/core/camera/__init__.py @@ -57,7 +57,7 @@ class CameraBase(EventDispatcher): super(CameraBase, self).__init__() self.register_event_type('on_load') - self.register_event_type('on_frame') + self.register_event_type('on_texture') self.init_camera() @@ -116,9 +116,9 @@ class CameraBase(EventDispatcher): return self._texture.blit_buffer(self._buffer, colorfmt=self._format) self._buffer = None - self.dispatch('on_frame') + self.dispatch('on_texture') - def on_frame(self): + def on_texture(self): pass def on_load(self): diff --git a/kivy/core/camera/camera_opencv.py b/kivy/core/camera/camera_opencv.py index ce53ab8fc..66956b2f9 100644 --- a/kivy/core/camera/camera_opencv.py +++ b/kivy/core/camera/camera_opencv.py @@ -63,7 +63,7 @@ class CameraOpenCV(CameraBase): #get fps self.fps = cv.GetCaptureProperty(self._device, cv.CV_CAP_PROP_FPS) if self.fps <= 0: - self.fps = .03 + self.fps = 1/30 if not self.stopped: self.start() diff --git a/kivy/core/camera/camera_videocapture.py b/kivy/core/camera/camera_videocapture.py index ec7f740e3..7beb5a85b 100644 --- a/kivy/core/camera/camera_videocapture.py +++ b/kivy/core/camera/camera_videocapture.py @@ -34,7 +34,7 @@ class CameraVideoCapture(CameraBase): self._device.setResolution(self.resolution[0], self.resolution[1]) except: raise Exception('VideoCapture: Resolution not supported') - self.fps = .03 + self.fps = 1 / 30 def _update(self, dt): data, camera_width, camera_height = self._device.getBuffer() diff --git a/kivy/uix/camera.py b/kivy/uix/camera.py index 9bced4874..68342afed 100644 --- a/kivy/uix/camera.py +++ b/kivy/uix/camera.py @@ -89,7 +89,7 @@ class Camera(Image): resolution=self._on_index) self._on_index() - def on_frame(self, *l): + def on_tex(self, *l): self.canvas.ask_update() def _on_index(self, *largs): @@ -101,7 +101,7 @@ class Camera(Image): self._camera.bind(on_load=self._camera_loaded) if self.play: self._camera.start() - self._camera.bind(on_frame=self.on_frame) + self._camera.bind(on_texture=self.on_tex) def _camera_loaded(self, *largs): self.texture = self._camera.texture