4
4
import pygame
5
5
import pygame .locals as G
6
6
import cv2
7
+ from cv2_enumerate_cameras import enumerate_cameras
8
+
7
9
from Core .CThreadedEyeTracker import CThreadedEyeTracker
8
10
from Core .CDataset import CDataset
9
11
from Core .CLearnablePredictor import CLearnablePredictor
@@ -21,7 +23,8 @@ class App:
21
23
def __init__ (
22
24
self , tracker , dataset , predictor ,
23
25
fps = 30 , hasPredictions = True ,
24
- showWebcam = False , showFaceMesh = False , showEyes = not False
26
+ showWebcam = False , showFaceMesh = False , showEyes = not False ,
27
+ current_webcam = 0
25
28
):
26
29
self ._showFaceMesh = showFaceMesh
27
30
self ._faceMesh = None
@@ -58,6 +61,13 @@ def __init__(
58
61
self ._predictorMaskFace = False
59
62
self ._predictorMaskLeftEye = False
60
63
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
61
71
return
62
72
63
73
@property
@@ -230,19 +240,21 @@ def on_render(self, fps=0.0):
230
240
return
231
241
232
242
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 ))
234
246
modes = []
235
247
if self ._predictorMaskFace : modes .append ('no face' )
236
248
if self ._predictorMaskLeftEye : modes .append ('no left eye' )
237
249
if self ._predictorMaskRightEye : modes .append ('no right eye' )
238
250
239
251
if 0 < len (modes ):
240
- self . drawText ( '%s' % (', ' .join (modes ), ), ( 5 , 95 + 25 ), Colors .GREEN )
252
+ texts . append (( '%s' % (', ' .join (modes ), ), Colors .GREEN ) )
241
253
242
- self . drawText ( 'FPS: %.1f' % (fps , ), ( 5 , 95 + 25 + 25 ), Colors .BLACK )
254
+ texts . append (( 'FPS: %.1f' % (fps , ), Colors .BLACK ) )
243
255
# print screen resolution
244
256
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 ) )
246
258
247
259
if self ._showFaceMesh and not (self ._faceMesh is None ):
248
260
scaled = np .multiply (self ._faceMesh , self .WH [None ])
@@ -251,8 +263,26 @@ def _renderInfo(self, fps):
251
263
pygame .draw .circle (self ._display_surf , Colors .RED , tuple (p ), 2 , 0 )
252
264
continue
253
265
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 )
254
276
return
255
277
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
+
256
286
def _renderPredictions (self ):
257
287
window = self ._display_surf
258
288
wh = np .array (window .get_size ())
@@ -343,8 +373,8 @@ def _modelFromArgs(args):
343
373
344
374
# My own ids hardcoded here for simplicity
345
375
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 '
348
378
return CModelWrapper (
349
379
timesteps = args .steps ,
350
380
user = dict (
@@ -362,10 +392,15 @@ def _predictorFromArgs(args):
362
392
return CLearnablePredictor (model = model , fps = args .fps )
363
393
364
394
def main (args ):
395
+ # if webcam a number - convert to int
396
+ if args .webcam .isdigit (): args .webcam = int (args .webcam )
365
397
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 :
367
399
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
+ )
369
404
app .run ()
370
405
pass
371
406
return
@@ -377,5 +412,6 @@ def main(args):
377
412
# if 'none' - no model will be used
378
413
parser .add_argument ('--model' , type = str , default = 'best' )
379
414
parser .add_argument ('--fps' , type = int , default = 30 )
415
+ parser .add_argument ('--webcam' , type = str , default = '0' )
380
416
main (parser .parse_args ())
381
417
pass
0 commit comments