diff --git a/SimpleCV/Camera.py b/SimpleCV/Camera.py index fb799def7..0bcd7f63f 100644 --- a/SimpleCV/Camera.py +++ b/SimpleCV/Camera.py @@ -2720,7 +2720,6 @@ class AVTCamera(FrameSource): >>> img = cam.getImage() >>> img.show() """ - _buffer = None # Buffer to store images _buffersize = 10 # Number of images to keep in the rolling image buffer for threads @@ -2965,7 +2964,6 @@ def __init__(self, camera_id = -1, properties = {}, threaded = False): #call, since it blocks on cameras initializing camlist = self.listAllCameras() - if not len(camlist): raise Exception("Couldn't find any cameras with the PvAVT driver. Use SampleViewer to confirm you have one connected.") @@ -2976,6 +2974,7 @@ def __init__(self, camera_id = -1, properties = {}, threaded = False): camera_id = camlist[camera_id].UniqueId camera_id = long(camera_id) + self.handle = ct.c_uint() init_count = 0 while self.dll.PvCameraOpen(camera_id,0,ct.byref(self.handle)) != 0: #wait until camera is availble @@ -3189,7 +3188,7 @@ def setProperty(self, name, value, skip_buffer_size_check=False): return err - def getImage(self, timeout = 5000): + def getImage(self, timeout = 5000, hwtrigger = False): """ **SUMMARY** Extract an Image from the Camera, returning the value. No matter @@ -3201,7 +3200,7 @@ def getImage(self, timeout = 5000): >>>c = AVTCamera() >>>c.getImage().show() """ - + if self.frame != None: st = time.time() try: @@ -3224,12 +3223,16 @@ def getImage(self, timeout = 5000): self._thread.lock.release() else: + self.runCommand("AcquisitionStart") - frame = self._getFrame(timeout) + frame = self._getFrame(timeout,hwtrigger) + img = Image(pil.fromstring(self.imgformat, (self.width, self.height), frame.ImageBuffer[:int(frame.ImageBufferSize)])) self.runCommand("AcquisitionStop") + + return img @@ -3258,24 +3261,43 @@ def _refreshFrameStats(self): if self.pixelformat == 'Mono8': self.imgformat = 'L' - def _getFrame(self, timeout = 5000): + def _getFrame(self, timeout = 5000, hwtrigger = False): #return the AVTFrame object from the camera, timeout in ms #need to multiply by bitdepth - try: - frame = self.AVTFrame(self.buffersize) - pverr( self.dll.PvCaptureQueueFrame(self.handle, ct.byref(frame), None) ) - st = time.time() - try: - pverr( self.dll.PvCaptureWaitForFrameDone(self.handle, ct.byref(frame), timeout) ) - except Exception, e: - print "Exception waiting for frame:", e - print "Time taken:",time.time() - st - raise(e) - - except Exception, e: - print "Exception aquiring frame:", e - raise(e) - + + if hwtrigger == False: + try: + frame = self.AVTFrame(self.buffersize) + pverr( self.dll.PvCaptureQueueFrame(self.handle, ct.byref(frame), None) ) + st = time.time() + try: + pverr( self.dll.PvCaptureWaitForFrameDone(self.handle, ct.byref(frame), timeout) ) + except Exception, e: + print "Exception waiting for frame:", e + print "Time taken:",time.time() - st + raise(e) + + except Exception, e: + print "Exception aquiring frame:", e + raise(e) + else: + try: + frame = self.AVTFrame(self.buffersize) + pverr( self.dll.PvCaptureQueueFrame(self.handle, ct.byref(frame), None) ) + st = time.time() + try: + while self.dll.PvCaptureWaitForFrameDone(self.handle, ct.byref(frame), timeout) == 17: #timeout error + print ("waiting trigger") + + except Exception, e: + print "Exception waiting for frame:", e + print "Time taken:",time.time() - st + raise(e) + + except Exception, e: + print "Exception aquiring frame:", e + raise(e) + return frame def acquire(self):