chiark / gitweb /
Add some OpenCV support to webcam class (untested).
authordaid <daid303@gmail.com>
Wed, 26 Sep 2012 11:19:12 +0000 (13:19 +0200)
committerdaid <daid303@gmail.com>
Wed, 26 Sep 2012 11:19:12 +0000 (13:19 +0200)
Cura/gui/webcam.py
Cura/util/machineCom.py

index 5b5a946b8dfa4d024ef96cd6cea4d959d00ddd85..af651e4ac18a608311a02aa9f1a6dd137f75c9ff 100644 (file)
@@ -1,6 +1,13 @@
 import os, glob, subprocess\r
 import wx\r
 \r
+try:\r
+       #Try to find the OpenCV library for video capture.\r
+       from opencv import cv\r
+       from opencv import highgui\r
+except:\r
+       cv = None\r
+\r
 try:\r
        #Use the vidcap library directly from the VideoCapture package. (Windows only)\r
        #       http://videocapture.sourceforge.net/\r
@@ -9,11 +16,11 @@ try:
 except:\r
        win32vidcap = None\r
 \r
-#TODO: We can also use OpenCV for camera capture. This should be cross platform compatible.\r
-\r
 class webcam(object):\r
        def __init__(self):\r
-               if win32vidcap != None:\r
+               if cv != None:\r
+                       self._cam = highgui.cvCreateCameraCapture(-1)\r
+               elif win32vidcap != None:\r
                        self._cam = win32vidcap.new_Dev(0, False)\r
                        #self._cam.displaycapturefilterproperties()\r
                        #self._cam.displaycapturepinproperties()\r
@@ -24,14 +31,19 @@ class webcam(object):
                self._bitmap = None\r
        \r
        def takeNewImage(self):\r
-               buffer, width, height = self._cam.getbuffer()\r
-               wxImage = wx.EmptyImage(width, height)\r
-               wxImage.SetData(buffer[::-1])\r
-               if self._bitmap != None:\r
-                       del self._bitmap\r
-               self._bitmap = wxImage.ConvertToBitmap()\r
-               del wxImage\r
-               del buffer\r
+               if cv != None:\r
+                       frame = cv.QueryFrame(self._cam)\r
+                       cv.CvtColor(frame, frame, cv.CV_BGR2RGB)\r
+                       self._bitmap = wx.BitmapFromBuffer(frame.width, frame.height, frame.imageData)\r
+               elif win32vidcap != None:\r
+                       buffer, width, height = self._cam.getbuffer()\r
+                       wxImage = wx.EmptyImage(width, height)\r
+                       wxImage.SetData(buffer[::-1])\r
+                       if self._bitmap != None:\r
+                               del self._bitmap\r
+                       self._bitmap = wxImage.ConvertToBitmap()\r
+                       del wxImage\r
+                       del buffer\r
 \r
                if self._doTimelaps:\r
                        filename = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap", "__tmp_snap_%04d.jpg" % (self._snapshotCount)))\r
@@ -51,7 +63,10 @@ class webcam(object):
        \r
        def endTimelaps(self):\r
                if self._doTimelaps:\r
-                       ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe"))\r
+                       if platform.system() == "Windows":\r
+                               ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe"))\r
+                       else:\r
+                               ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg"))\r
                        basePath = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap", "__tmp_snap_%04d.jpg"))\r
                        subprocess.call([ffmpeg, '-r', '12.5', '-i', basePath, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', '-b:v', '1500k', '-f', 'vob', self._timelapsFilename])\r
                self._doTimelaps = False\r
index 802977196f33883b58198dc95788e7b4bed9e655..971e88fb25524ca14bbced41ecff05e3cb3cdb93 100644 (file)
@@ -154,18 +154,18 @@ class MachineCom(object):
                if port == 'AUTO':
                        programmer = stk500v2.Stk500v2()
                        self._log("Serial port list: %s" % (str(serialList())))
-                       for port in serialList():
+                       for p in serialList():
                                try:
-                                       self._log("Connecting to: %s" % (port))
-                                       programmer.connect(port)
+                                       self._log("Connecting to: %s" % (p))
+                                       programmer.connect(p)
                                        self._serial = programmer.leaveISP()
-                                       profile.putPreference('serial_port_auto', port)
+                                       profile.putPreference('serial_port_auto', p)
                                        break
                                except ispBase.IspError as (e):
-                                       self._log("Error while connecting to %s: %s" % (port, str(e)))
+                                       self._log("Error while connecting to %s: %s" % (p, str(e)))
                                        pass
                                except:
-                                       self._log("Unexpected error while connecting to serial port: %s %s" % (port, getExceptionString()))
+                                       self._log("Unexpected error while connecting to serial port: %s %s" % (p, getExceptionString()))
                                programmer.close()
                elif port == 'VIRTUAL':
                        self._serial = VirtualPrinter()
@@ -178,6 +178,11 @@ class MachineCom(object):
                                        self._serial = Serial(port, baudrate, timeout=2)
                        except:
                                self._log("Unexpected error while connecting to serial port: %s %s" % (port, getExceptionString()))
+               if self._serial == None:
+                       self._log("Failed to open serial port (%s)" % (port))
+                       self._errorValue = 'Failed to autodetect serial port.'
+                       self._changeState(self.STATE_ERROR)
+                       return
                self._log("Connected to: %s, starting monitor" % (self._serial))
                if baudrate == 0:
                        self._changeState(self.STATE_DETECT_BAUDRATE)