44import pygame
55import pygame .locals as G
66import cv2
7+ from cv2_enumerate_cameras import enumerate_cameras
8+
79from Core .CThreadedEyeTracker import CThreadedEyeTracker
810from Core .CDataset import CDataset
911from Core .CLearnablePredictor import CLearnablePredictor
@@ -21,7 +23,8 @@ class App:
2123 def __init__ (
2224 self , tracker , dataset , predictor ,
2325 fps = 30 , hasPredictions = True ,
24- showWebcam = False , showFaceMesh = False , showEyes = not False
26+ showWebcam = False , showFaceMesh = False , showEyes = not False ,
27+ current_webcam = 0
2528 ):
2629 self ._showFaceMesh = showFaceMesh
2730 self ._faceMesh = None
@@ -58,6 +61,13 @@ def __init__(
5861 self ._predictorMaskFace = False
5962 self ._predictorMaskLeftEye = False
6063 self ._predictorMaskRightEye = False
64+
65+ self ._webcam = current_webcam
66+ webcamsList = []
67+ for camera_info in enumerate_cameras ():
68+ webcamsList .append ('%s: %s' % (camera_info .index , camera_info .name ))
69+
70+ self ._webcamsList = webcamsList
6171 return
6272
6373 @property
@@ -230,19 +240,21 @@ def on_render(self, fps=0.0):
230240 return
231241
232242 def _renderInfo (self , fps ):
233- self .drawText ('Samples: %d' % (self ._dataset .totalSamples , ), (5 , 95 ), Colors .RED )
243+ startPoints = (5 , 95 )
244+ texts = []
245+ texts .append (('Samples: %d' % (self ._dataset .totalSamples , ), Colors .RED ))
234246 modes = []
235247 if self ._predictorMaskFace : modes .append ('no face' )
236248 if self ._predictorMaskLeftEye : modes .append ('no left eye' )
237249 if self ._predictorMaskRightEye : modes .append ('no right eye' )
238250
239251 if 0 < len (modes ):
240- self . drawText ( '%s' % (', ' .join (modes ), ), ( 5 , 95 + 25 ), Colors .GREEN )
252+ texts . append (( '%s' % (', ' .join (modes ), ), Colors .GREEN ) )
241253
242- self . drawText ( 'FPS: %.1f' % (fps , ), ( 5 , 95 + 25 + 25 ), Colors .BLACK )
254+ texts . append (( 'FPS: %.1f' % (fps , ), Colors .BLACK ) )
243255 # print screen resolution
244256 wh = self .WH
245- self . drawText ( 'Resolution: %d x %d' % (wh [0 ], wh [1 ]), ( 5 , 95 + 25 + 25 + 25 ), Colors .BLACK )
257+ texts . append (( 'Resolution: %d x %d' % (wh [0 ], wh [1 ]), Colors .BLACK ) )
246258
247259 if self ._showFaceMesh and not (self ._faceMesh is None ):
248260 scaled = np .multiply (self ._faceMesh , self .WH [None ])
@@ -251,8 +263,26 @@ def _renderInfo(self, fps):
251263 pygame .draw .circle (self ._display_surf , Colors .RED , tuple (p ), 2 , 0 )
252264 continue
253265 pass
266+
267+ # print webcam info
268+ texts .append (('' , Colors .BLACK ))
269+ texts .append (('Webcams:' , Colors .BLACK ))
270+ for i , name in enumerate (self ._webcamsList ):
271+ color = Colors .RED if i == self ._webcam else Colors .BLACK
272+ texts .append (('%d: %s' % (i , name ), color ))
273+ continue
274+
275+ self .drawTextList (texts , startPoints , height = 25 )
254276 return
255277
278+ def drawTextList (self , texts , start , height ):
279+ x , y = start
280+ for text , color in texts :
281+ self .drawText (text , (x , y ), color )
282+ y += height
283+ continue
284+ return
285+
256286 def _renderPredictions (self ):
257287 window = self ._display_surf
258288 wh = np .array (window .get_size ())
@@ -343,8 +373,8 @@ def _modelFromArgs(args):
343373
344374 # My own ids hardcoded here for simplicity
345375 userId = 'ce42c1a9-f4ef-42d6-a219-cf25fad912ed'
346- placeId = '29ecaa6a-d3b5-784b-887e-f50a0c6533fa '
347- screenId = placeId + '/' + '29f35417-7bb7-3c94-124c-2ae16bda235d '
376+ placeId = 'de0ce61b-2fc0-02f6-efb5-22af447bfb05 '
377+ screenId = placeId + '/' + 'a28a2ad8-4349-b038-5af8-46a658e82543 '
348378 return CModelWrapper (
349379 timesteps = args .steps ,
350380 user = dict (
@@ -362,10 +392,15 @@ def _predictorFromArgs(args):
362392 return CLearnablePredictor (model = model , fps = args .fps )
363393
364394def main (args ):
395+ # if webcam a number - convert to int
396+ if args .webcam .isdigit (): args .webcam = int (args .webcam )
365397 folder = args .folder
366- with CThreadedEyeTracker () as tracker , CDataset (os .path .join (folder , 'Dataset' ), args .steps ) as dataset :
398+ with CThreadedEyeTracker (webcam = args . webcam ) as tracker , CDataset (os .path .join (folder , 'Dataset' ), args .steps ) as dataset :
367399 with _predictorFromArgs (args ) as predictor :
368- app = App (tracker , dataset , predictor = predictor .async_infer , fps = args .fps , hasPredictions = predictor .canPredict )
400+ app = App (
401+ tracker , dataset , predictor = predictor .async_infer , fps = args .fps , hasPredictions = predictor .canPredict ,
402+ current_webcam = args .webcam
403+ )
369404 app .run ()
370405 pass
371406 return
@@ -377,5 +412,6 @@ def main(args):
377412 # if 'none' - no model will be used
378413 parser .add_argument ('--model' , type = str , default = 'best' )
379414 parser .add_argument ('--fps' , type = int , default = 30 )
415+ parser .add_argument ('--webcam' , type = str , default = '0' )
380416 main (parser .parse_args ())
381417 pass
0 commit comments