chiark / gitweb /
Updated webcam support a bit, still needs more work to access properties, and enable...
authordaid <daid303@gmail.com>
Thu, 27 Sep 2012 15:20:31 +0000 (17:20 +0200)
committerdaid <daid303@gmail.com>
Thu, 27 Sep 2012 15:20:31 +0000 (17:20 +0200)
Cura/gui/printWindow.py
Cura/gui/webcam.py

index a69e18e76a3d343488744027a189ed948abe97e2..a9345dcdf10b36ad9a82a56806ed9bb5652e92ec 100644 (file)
@@ -98,10 +98,8 @@ class printWindow(wx.Frame):
                self.termHistoryIdx = 0\r
                \r
                self.cam = None\r
-               try:\r
+               if webcam.hasWebcamSupport():\r
                        self.cam = webcam.webcam()\r
-               except:\r
-                       pass\r
 \r
                #self.SetIcon(icon.getMainIcon())\r
                \r
@@ -239,16 +237,19 @@ class printWindow(wx.Frame):
 \r
                nb.AddPage(self.termPanel, 'Term')\r
                \r
-               if self.cam != None:\r
+               if self.cam != None and self.cam.hasCamera():\r
                        self.camPage = wx.Panel(nb)\r
                        sizer = wx.GridBagSizer(2, 2)\r
                        self.camPage.SetSizer(sizer)\r
                        \r
+                       self.camPreview = wx.Panel(self.camPage)\r
+                       sizer.Add(self.camPreview, pos=(0,0), flag=wx.EXPAND)\r
+                       \r
                        nb.AddPage(self.camPage, 'Camera')\r
-                       self.camPage.timer = wx.Timer(self)\r
-                       self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPage.timer)\r
-                       self.camPage.timer.Start(500)\r
-                       self.camPage.Bind(wx.EVT_ERASE_BACKGROUND, self.OnCameraEraseBackground)\r
+                       self.camPreview.timer = wx.Timer(self)\r
+                       self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPreview.timer)\r
+                       self.camPreview.timer.Start(500)\r
+                       self.camPreview.Bind(wx.EVT_ERASE_BACKGROUND, self.OnCameraEraseBackground)\r
 \r
                self.sizer.AddGrowableRow(3)\r
                self.sizer.AddGrowableCol(3)\r
@@ -281,7 +282,7 @@ class printWindow(wx.Frame):
                if self.machineCom != None and not self.machineCom.isPrinting():\r
                        return\r
                self.cam.takeNewImage()\r
-               self.camPage.Refresh()\r
+               self.camPreview.Refresh()\r
        \r
        def OnCameraEraseBackground(self, e):\r
                dc = e.GetDC()\r
@@ -289,7 +290,7 @@ class printWindow(wx.Frame):
                        dc = wx.ClientDC(self)\r
                        rect = self.GetUpdateRegion().GetBox()\r
                        dc.SetClippingRect(rect)\r
-               dc.SetBackground(wx.Brush(self.camPage.GetBackgroundColour(), wx.SOLID))\r
+               dc.SetBackground(wx.Brush(self.camPreview.GetBackgroundColour(), wx.SOLID))\r
                dc.Clear()\r
                if self.cam.getLastImage() != None:\r
                        dc.DrawBitmap(self.cam.getLastImage(), 0, 0)\r
@@ -487,7 +488,7 @@ class printWindow(wx.Frame):
        def mcZChange(self, newZ):\r
                if self.cam != None:\r
                        wx.CallAfter(self.cam.takeNewImage)\r
-                       wx.CallAfter(self.camPage.Refresh)\r
+                       wx.CallAfter(self.camPreview.Refresh)\r
 \r
 class temperatureGraph(wx.Panel):\r
        def __init__(self, parent):\r
index af651e4ac18a608311a02aa9f1a6dd137f75c9ff..96d0f01cd8ae7a21c9f735fc90134c0fcefdb061 100644 (file)
@@ -1,4 +1,4 @@
-import os, glob, subprocess\r
+import os, glob, subprocess, platform\r
 import wx\r
 \r
 try:\r
@@ -16,21 +16,58 @@ try:
 except:\r
        win32vidcap = None\r
 \r
+def hasWebcamSupport():\r
+       if cv == None and win32vidcap == None:\r
+               return False\r
+       if not os.path.exists(getFFMPEGpath()):\r
+               return False\r
+       return True\r
+\r
+def getFFMPEGpath():\r
+       if platform.system() == "Windows":\r
+               return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe"))\r
+       elif os.path.exists('/usr/bin/ffmpeg'):\r
+               return '/usr/bin/ffmpeg'\r
+       return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg"))\r
+\r
 class webcam(object):\r
        def __init__(self):\r
+               self._cam = 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
-               else:\r
-                       raise exception("No camera implementation available")\r
+                       try:\r
+                               self._cam = win32vidcap.new_Dev(0, False)\r
+                       except:\r
+                               pass\r
                \r
                self._doTimelaps = False\r
                self._bitmap = None\r
        \r
+       def hasCamera(self):\r
+               return self._cam != None\r
+       \r
+       def propertyPages():\r
+               if self._cam == None:\r
+                       return []\r
+               if win32vidcap != None:\r
+                       return ['capture properties', 'pin properties']\r
+               if cv != None:\r
+                       #TODO Make an OpenCV property page\r
+                       return []\r
+\r
+       def openPropertyPage(pageType = 0):\r
+               if self._cam == None:\r
+                       return\r
+               if win32vidcap != None:\r
+                       if pageType == 0:\r
+                               self._cam.displaycapturefilterproperties()\r
+                       else:\r
+                               self._cam.displaycapturepinproperties()\r
+       \r
        def takeNewImage(self):\r
+               if self._cam == None:\r
+                       return\r
                if cv != None:\r
                        frame = cv.QueryFrame(self._cam)\r
                        cv.CvtColor(frame, frame, cv.CV_BGR2RGB)\r
@@ -56,6 +93,8 @@ class webcam(object):
                return self._bitmap\r
        \r
        def startTimelaps(self, filename):\r
+               if self._cam == None:\r
+                       return\r
                self._cleanTempDir()\r
                self._timelapsFilename = filename\r
                self._snapshotCount = 0\r
@@ -63,10 +102,7 @@ class webcam(object):
        \r
        def endTimelaps(self):\r
                if self._doTimelaps:\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
+                       ffmpeg = getFFMPEGpath()\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