Skip to content

Commit 64cb085

Browse files
committed
Add a second webcam example that runs a lot faster
1 parent 11ee1ea commit 64cb085

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ All the examples are available [here](https://github.com/ageitgey/face_recogniti
200200
* [Identify specific facial features in a photograph](https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py)
201201
* [Apply (horribly ugly) digital make-up](https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py)
202202
* [Find and recognize unknown faces in a photograph based on photographs of known people](https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py)
203-
* [Recognize faces in live video using your webcam (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam.py)
203+
* [Recognize faces in live video using your webcam - Simple / Slower Version (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam.py)
204+
* [Recognize faces in live video using your webcam - Faster Version (Requires OpenCV to be installed)](https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py)
204205

205206
## How Face Recognition Works
206207

@@ -228,7 +229,7 @@ to any service that supports Docker images.
228229
Solution: `dlib` is compiled with SSE4 or AVX support, but your CPU is too old and doesn't support that.
229230
You'll need to recompile `dlib` after [making the code change outlined here](https://github.com/ageitgey/face_recognition/issues/11#issuecomment-287398611).
230231

231-
##### Issue: `RuntimeError: Unsupported image type, must be 8bit gray or RGB image.` when running the webcam example.
232+
##### Issue: `RuntimeError: Unsupported image type, must be 8bit gray or RGB image.` when running the webcam examples.
232233

233234
Solution: Your webcam probably isn't set up correctly with OpenCV. [Look here for more](https://github.com/ageitgey/face_recognition/issues/21#issuecomment-287779524).
234235

examples/facerec_from_webcam.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import face_recognition
22
import cv2
33

4-
# This is a super simple demo of running face recognition on live video from your webcam.
4+
# This is a super simple (but slow) example of running face recognition on live video from your webcam.
5+
# There's a second example that's a little more complicated but runs faster.
56

67
# PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
78
# OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import face_recognition
2+
import cv2
3+
4+
# This is a demo of running face recognition on live video from your webcam. It's a little more complicated than the
5+
# other example, but it includes some basic performance tweaks to make things run a lot faster:
6+
# 1. Process each video frame at 1/4 resolution (though still display it at full resolution)
7+
# 2. Only detect faces in every other frame of video.
8+
9+
# PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
10+
# OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
11+
# specific demo. If you have trouble installing it, try any of the other demos that don't require it instead.
12+
13+
# Get a reference to webcam #0 (the default one)
14+
video_capture = cv2.VideoCapture(0)
15+
16+
# Load a sample picture and learn how to recognize it.
17+
obama_image = face_recognition.load_image_file("obama.jpg")
18+
obama_face_encoding = face_recognition.face_encodings(obama_image)[0]
19+
20+
# Initialize some variables
21+
face_locations = []
22+
face_encodings = []
23+
face_names = []
24+
process_this_frame = True
25+
26+
while True:
27+
# Grab a single frame of video
28+
ret, frame = video_capture.read()
29+
30+
# Resize frame of video to 1/4 size for faster face recognition processing
31+
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
32+
33+
# Only process every other frame of video to save time
34+
if process_this_frame:
35+
# Find all the faces and face encodings in the current frame of video
36+
face_locations = face_recognition.face_locations(small_frame)
37+
face_encodings = face_recognition.face_encodings(small_frame, face_locations)
38+
39+
face_names = []
40+
for face_encoding in face_encodings:
41+
# See if the face is a match for the known face(s)
42+
match = face_recognition.compare_faces([obama_face_encoding], face_encoding)
43+
name = "Unknown"
44+
45+
if match[0]:
46+
name = "Barack"
47+
48+
face_names.append(name)
49+
50+
process_this_frame = not process_this_frame
51+
52+
53+
# Display the results
54+
for (top, right, bottom, left), name in zip(face_locations, face_names):
55+
# Scale back up face locations since the frame we detected in was scaled to 1/4 size
56+
top *= 4
57+
right *= 4
58+
bottom *= 4
59+
left *= 4
60+
61+
# Draw a box around the face
62+
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
63+
64+
# Draw a label with a name below the face
65+
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
66+
font = cv2.FONT_HERSHEY_DUPLEX
67+
cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
68+
69+
# Display the resulting image
70+
cv2.imshow('Video', frame)
71+
72+
# Hit 'q' on the keyboard to quit!
73+
if cv2.waitKey(1) & 0xFF == ord('q'):
74+
break
75+
76+
# Release handle to the webcam
77+
video_capture.release()
78+
cv2.destroyAllWindows()

0 commit comments

Comments
 (0)