def ModelTakePhoto( bib, raceSeconds ): race = Model.race if race: if PhotoFinish.okTakePhoto(bib, raceSeconds): if race.enableVideoBuffer: return TakePhoto( Utils.mainWin.fileName if Utils.mainWin else _getTestPhotoFileName(), bib, raceSeconds ) elif race.enableUSBCamera: return PhotoFinish.TakePhoto( Utils.mainWin.fileName if Utils.mainWin else _getTestPhotoFileName(), bib, raceSeconds ) else: return 0 else: return PhotoFinish.TakePhoto( _getTestPhotoFileName(), bib, raceSeconds ) Utils.cameraError = _('ModelTakePhoto: usb camera is not enabled') return 0
def StartVideoBuffer( refTime, raceFileName ): global videoBuffer if not videoBuffer: camera = PhotoFinish.SetCameraState( True ) if not camera: return False dirName = PhotoFinish.getPhotoDirName( raceFileName ) if not os.path.isdir( dirName ): try: os.makedirs( dirName ) except Exception as e: logException( e, sys.exc_info() ) return False videoBuffer = VideoBuffer( camera, refTime, dirName ) videoBuffer.start() return True
def refresh(self, videoBuffer, t, num=None): if not videoBuffer: for s in six.moves.range(len(self.photoLabels)): for i in six.moves.range(len(self.photoLabels[s])): self.photoBitmaps[s][i].SetBitmapLabel(self.bitmap) self.photoLabels[s][i].SetLabel('') return if not self.captureButton.GetValue(): return tCur = videoBuffer.refTime + datetime.timedelta(seconds=t) timeFrames = videoBuffer.findBeforeAfter(t, self.numPhotos // 2, self.numPhotos // 2, 60.0 * 60.0) deltaMS = [((tFrame - tCur).total_seconds() * 1000.0) for tFrame, frame in timeFrames] if len(timeFrames) < self.numPhotos: d = self.numPhotos - len(timeFrames) timeFrames = ([(None, None)] * d) + timeFrames deltaMS = ([None] * d) + deltaMS photoLabels = self.photoLabels[self.iSeries] photoBitmaps = self.photoBitmaps[self.iSeries] deltaMin = sys.float_info.max iMin = 0 dc = wx.WindowDC(self) for i, (tFrame, frame) in enumerate(timeFrames): if deltaMS[i] is not None and abs(deltaMS[i]) < deltaMin: deltaMin = abs(deltaMS[i]) iMin = i if deltaMS[i] is None: photoLabels[i].SetLabel(u'') photoBitmaps[i].SetBitmapLabel(wx.NullBitmap) else: photoLabels[i].SetLabel(u'{}ms'.format(deltaMS[i])) image = PhotoFinish.PilImageToWxImage(frame) image = RescaleImage(image, self.photoWidth, self.photoHeight) bitmap = image.ConvertToBitmap() photoBitmaps[i].SetBitmapLabel(bitmap) self.titles[self.iSeries] = getTitle(num, t) self.title.SetLabel(self.titles[self.iSeries]) self.Refresh() self.iSeries = (self.iSeries + 1) % self.numPhotoSeries self.captureCount += 1 if self.captureCount >= self.numPhotoSeries: self.captureButton.SetValue(False)
def run( self ): self.reset() while 1: message = self.queue.get() if message[0] == 'Save': cmd, fileName, bib, t, frame = message #sys.stderr.write( 'save' ) PhotoFinish.SavePhoto( fileName, bib, t, frame ) self.queue.task_done() elif message[0] == 'Terminate': self.queue.task_done() self.reset() break
def ModelStartCamera( refTime=None, raceFileName=None ): Shutdown() race = Model.race if race and race.enableUSBCamera: if refTime is None: refTime = race.startTime if raceFileName is None: raceFileName = Utils.getFileName() assert refTime is not None and raceFileName is not None if race.enableJChipIntegration: StartVideoBuffer( refTime, raceFileName ) else: PhotoFinish.SetCameraState( True ) return True return False
def GetFilename( bib, t, dirName, i ): return os.path.join( dirName, fileFormat % (bib if bib else 0, PhotoFinish.fileFormatTime(t), (i+1) ) )
if __name__ == '__main__': import time import shutil race = Model.newRace() race._populate() app = wx.App(False) dirName = 'VideoBufferTest_Photos' if os.path.isdir(dirName): shutil.rmtree( dirName, True ) os.mkdir( dirName ) tRef = datetime.datetime.now() camera = PhotoFinish.SetCameraState( True ) vb = VideoBuffer.VideoBuffer( camera, tRef, dirName ) vb.start() time.sleep( 1.0 ) mainWin = wx.Frame(None, title="CrossMan", size=(600,400)) mainWin.Show() photoSyncDialog = PhotoSyncViewerDialog( mainWin, title = u"PhotoSyncViewer", size=(600,400) ) def doRefresh( bib ): t = (datetime.datetime.now() - tRef).total_seconds() wx.CallLater( 300, photoSyncDialog.refresh, vb, t, bib ) photoSyncDialog.Show() photoSyncDialog.reset() bib = 100 for d in xrange(0, 1000*60, 1000):
def Shutdown(): global videoBuffer if videoBuffer: videoBuffer.stop() videoBuffer = None PhotoFinish.SetCameraState( False )