From: daid Date: Thu, 27 Sep 2012 15:20:31 +0000 (+0200) Subject: Updated webcam support a bit, still needs more work to access properties, and enable... X-Git-Tag: 13.03~320 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=a0c1daa36c13c04c7068357e740ae106236fed27;p=cura.git Updated webcam support a bit, still needs more work to access properties, and enable/disable timelaps movie creation. --- diff --git a/Cura/gui/printWindow.py b/Cura/gui/printWindow.py index a69e18e7..a9345dcd 100644 --- a/Cura/gui/printWindow.py +++ b/Cura/gui/printWindow.py @@ -98,10 +98,8 @@ class printWindow(wx.Frame): self.termHistoryIdx = 0 self.cam = None - try: + if webcam.hasWebcamSupport(): self.cam = webcam.webcam() - except: - pass #self.SetIcon(icon.getMainIcon()) @@ -239,16 +237,19 @@ class printWindow(wx.Frame): nb.AddPage(self.termPanel, 'Term') - if self.cam != None: + if self.cam != None and self.cam.hasCamera(): self.camPage = wx.Panel(nb) sizer = wx.GridBagSizer(2, 2) self.camPage.SetSizer(sizer) + self.camPreview = wx.Panel(self.camPage) + sizer.Add(self.camPreview, pos=(0,0), flag=wx.EXPAND) + nb.AddPage(self.camPage, 'Camera') - self.camPage.timer = wx.Timer(self) - self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPage.timer) - self.camPage.timer.Start(500) - self.camPage.Bind(wx.EVT_ERASE_BACKGROUND, self.OnCameraEraseBackground) + self.camPreview.timer = wx.Timer(self) + self.Bind(wx.EVT_TIMER, self.OnCameraTimer, self.camPreview.timer) + self.camPreview.timer.Start(500) + self.camPreview.Bind(wx.EVT_ERASE_BACKGROUND, self.OnCameraEraseBackground) self.sizer.AddGrowableRow(3) self.sizer.AddGrowableCol(3) @@ -281,7 +282,7 @@ class printWindow(wx.Frame): if self.machineCom != None and not self.machineCom.isPrinting(): return self.cam.takeNewImage() - self.camPage.Refresh() + self.camPreview.Refresh() def OnCameraEraseBackground(self, e): dc = e.GetDC() @@ -289,7 +290,7 @@ class printWindow(wx.Frame): dc = wx.ClientDC(self) rect = self.GetUpdateRegion().GetBox() dc.SetClippingRect(rect) - dc.SetBackground(wx.Brush(self.camPage.GetBackgroundColour(), wx.SOLID)) + dc.SetBackground(wx.Brush(self.camPreview.GetBackgroundColour(), wx.SOLID)) dc.Clear() if self.cam.getLastImage() != None: dc.DrawBitmap(self.cam.getLastImage(), 0, 0) @@ -487,7 +488,7 @@ class printWindow(wx.Frame): def mcZChange(self, newZ): if self.cam != None: wx.CallAfter(self.cam.takeNewImage) - wx.CallAfter(self.camPage.Refresh) + wx.CallAfter(self.camPreview.Refresh) class temperatureGraph(wx.Panel): def __init__(self, parent): diff --git a/Cura/gui/webcam.py b/Cura/gui/webcam.py index af651e4a..96d0f01c 100644 --- a/Cura/gui/webcam.py +++ b/Cura/gui/webcam.py @@ -1,4 +1,4 @@ -import os, glob, subprocess +import os, glob, subprocess, platform import wx try: @@ -16,21 +16,58 @@ try: except: win32vidcap = None +def hasWebcamSupport(): + if cv == None and win32vidcap == None: + return False + if not os.path.exists(getFFMPEGpath()): + return False + return True + +def getFFMPEGpath(): + if platform.system() == "Windows": + return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe")) + elif os.path.exists('/usr/bin/ffmpeg'): + return '/usr/bin/ffmpeg' + return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg")) + class webcam(object): def __init__(self): + self._cam = None if cv != None: self._cam = highgui.cvCreateCameraCapture(-1) elif win32vidcap != None: - self._cam = win32vidcap.new_Dev(0, False) - #self._cam.displaycapturefilterproperties() - #self._cam.displaycapturepinproperties() - else: - raise exception("No camera implementation available") + try: + self._cam = win32vidcap.new_Dev(0, False) + except: + pass self._doTimelaps = False self._bitmap = None + def hasCamera(self): + return self._cam != None + + def propertyPages(): + if self._cam == None: + return [] + if win32vidcap != None: + return ['capture properties', 'pin properties'] + if cv != None: + #TODO Make an OpenCV property page + return [] + + def openPropertyPage(pageType = 0): + if self._cam == None: + return + if win32vidcap != None: + if pageType == 0: + self._cam.displaycapturefilterproperties() + else: + self._cam.displaycapturepinproperties() + def takeNewImage(self): + if self._cam == None: + return if cv != None: frame = cv.QueryFrame(self._cam) cv.CvtColor(frame, frame, cv.CV_BGR2RGB) @@ -56,6 +93,8 @@ class webcam(object): return self._bitmap def startTimelaps(self, filename): + if self._cam == None: + return self._cleanTempDir() self._timelapsFilename = filename self._snapshotCount = 0 @@ -63,10 +102,7 @@ class webcam(object): def endTimelaps(self): if self._doTimelaps: - if platform.system() == "Windows": - ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe")) - else: - ffmpeg = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg")) + ffmpeg = getFFMPEGpath() basePath = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap", "__tmp_snap_%04d.jpg")) subprocess.call([ffmpeg, '-r', '12.5', '-i', basePath, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', '-b:v', '1500k', '-f', 'vob', self._timelapsFilename]) self._doTimelaps = False