1 import os, glob, subprocess, platform
\r
5 #Try to find the OpenCV library for video capture.
\r
6 from opencv import cv
\r
7 from opencv import highgui
\r
12 #Use the vidcap library directly from the VideoCapture package. (Windows only)
\r
13 # http://videocapture.sourceforge.net/
\r
14 # We're using the binary interface, not the python interface, so we don't depend on PIL
\r
15 import vidcap as win32vidcap
\r
19 def hasWebcamSupport():
\r
20 if cv == None and win32vidcap == None:
\r
22 if not os.path.exists(getFFMPEGpath()):
\r
26 def getFFMPEGpath():
\r
27 if platform.system() == "Windows":
\r
28 return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg.exe"))
\r
29 elif os.path.exists('/usr/bin/ffmpeg'):
\r
30 return '/usr/bin/ffmpeg'
\r
31 return os.path.normpath(os.path.join(os.path.split(__file__)[0], "../ffmpeg"))
\r
33 class webcam(object):
\r
37 self._cam = highgui.cvCreateCameraCapture(-1)
\r
38 elif win32vidcap != None:
\r
40 self._cam = win32vidcap.new_Dev(0, False)
\r
44 self._doTimelaps = False
\r
47 def hasCamera(self):
\r
48 return self._cam != None
\r
50 def propertyPages(self):
\r
51 if self._cam == None:
\r
54 #TODO Make an OpenCV property page
\r
56 elif win32vidcap != None:
\r
57 return ['Image properties', 'Format properties']
\r
59 def openPropertyPage(self, pageType = 0):
\r
60 if self._cam == None:
\r
64 elif win32vidcap != None:
\r
66 self._cam.displaycapturefilterproperties()
\r
70 tmp = win32vidcap.new_Dev(0, False)
\r
71 tmp.displaycapturepinproperties()
\r
74 def takeNewImage(self):
\r
75 if self._cam == None:
\r
78 frame = cv.QueryFrame(self._cam)
\r
79 cv.CvtColor(frame, frame, cv.CV_BGR2RGB)
\r
80 self._bitmap = wx.BitmapFromBuffer(frame.width, frame.height, frame.imageData)
\r
81 elif win32vidcap != None:
\r
82 buffer, width, height = self._cam.getbuffer()
\r
84 wxImage = wx.EmptyImage(width, height)
\r
85 wxImage.SetData(buffer[::-1])
\r
86 if self._bitmap != None:
\r
88 self._bitmap = wxImage.ConvertToBitmap()
\r
94 if self._doTimelaps:
\r
95 filename = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap", "__tmp_snap_%04d.jpg" % (self._snapshotCount)))
\r
96 self._snapshotCount += 1
\r
97 self._bitmap.SaveFile(filename, wx.BITMAP_TYPE_JPEG)
\r
101 def getLastImage(self):
\r
102 return self._bitmap
\r
104 def startTimelaps(self, filename):
\r
105 if self._cam == None:
\r
107 self._cleanTempDir()
\r
108 self._timelapsFilename = filename
\r
109 self._snapshotCount = 0
\r
110 self._doTimelaps = True
\r
111 print "startTimelaps"
\r
113 def endTimelaps(self):
\r
114 if self._doTimelaps:
\r
115 ffmpeg = getFFMPEGpath()
\r
116 basePath = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap", "__tmp_snap_%04d.jpg"))
\r
117 subprocess.call([ffmpeg, '-r', '12.5', '-i', basePath, '-vcodec', 'mpeg2video', '-pix_fmt', 'yuv420p', '-r', '25', '-y', '-b:v', '1500k', '-f', 'vob', self._timelapsFilename])
\r
118 self._doTimelaps = False
\r
120 def _cleanTempDir(self):
\r
121 basePath = os.path.normpath(os.path.join(os.path.split(__file__)[0], "../__tmp_snap"))
\r
123 os.makedirs(basePath)
\r
126 for filename in glob.iglob(basePath + "/*.jpg"):
\r
127 os.remove(filename)
\r