Skip to content

Commit a263939

Browse files
attempt to make a webcamera selectable
1 parent 45a2de0 commit a263939

File tree

4 files changed

+54
-15
lines changed

4 files changed

+54
-15
lines changed

Core/CEyeTracker.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
import time
66

77
class CEyeTracker:
8-
def __init__(self):
8+
def __init__(self, webcam=0):
9+
self._webcam = webcam
910
self._PRESENCE_THRESHOLD = self._VISIBILITY_THRESHOLD = 0.5
1011

1112
self._leftEyeIdx = np.array(list(Utils.PART_TO_INDECES['left eye']), np.int32)
1213
self._rightEyeIdx = np.array(list(Utils.PART_TO_INDECES['right eye']), np.int32)
1314
return
1415

1516
def __enter__(self):
16-
cap = self._capture = cv2.VideoCapture(0)
17+
cap = self._capture = cv2.VideoCapture(self._webcam)
1718

1819
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
1920
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 768)

Core/CThreadedEyeTracker.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
import threading
33

44
class CThreadedEyeTracker:
5-
def __init__(self, fps=30):
5+
def __init__(self, fps=30, webcam=0):
66
self._lock = threading.Lock()
77
self._done = threading.Event()
88
self._results = None
99
self._fps = fps
10+
self._webcam = webcam
1011
return
1112

1213
def __enter__(self):
13-
self._tracker = CEyeTracker()
14+
self._tracker = CEyeTracker(webcam=self._webcam)
1415
self._tracker.__enter__()
1516

1617
self._thread = threading.Thread(target=self._trackLoop)

app.py

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import pygame
55
import pygame.locals as G
66
import cv2
7+
from cv2_enumerate_cameras import enumerate_cameras
8+
79
from Core.CThreadedEyeTracker import CThreadedEyeTracker
810
from Core.CDataset import CDataset
911
from 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

364394
def 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

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
tensorflow==2.7.0
2-
tensorflow-probability==0.15.0
1+
tensorflow==2.15.0
2+
tensorflow-probability==0.22.0
33
mediapipe==0.9.1.0
44
numpy
55
opencv-python
66
pygame
77
scipy
88
tqdm
9+
cv2_enumerate_cameras

0 commit comments

Comments
 (0)