41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
import cv2
|
|
|
|
CASCADE_PATH = "src/face.xml"
|
|
|
|
def run_camera(save_folder=None):
|
|
cap = cv2.VideoCapture(0)
|
|
if not cap.isOpened():
|
|
print("Cannot open camera")
|
|
return
|
|
face_cascade = cv2.CascadeClassifier(CASCADE_PATH)
|
|
print("Press 'q' to quit, 's' to save a snapshot of the detected faces")
|
|
idx = 0
|
|
while True:
|
|
ret, frame = cap.read()
|
|
if not ret:
|
|
print("Can't receive frame (stream end?). Exiting...")
|
|
break
|
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30))
|
|
for (x,y,w,h) in faces:
|
|
cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0), 2)
|
|
cv2.imshow('Camera - face.xml detection', frame)
|
|
key = cv2.waitKey(1) & 0xFF
|
|
if key == ord('q'):
|
|
break
|
|
if key == ord('s') and save_folder:
|
|
path = f"{save_folder}/snapshot_{idx}.jpg"
|
|
cv2.imwrite(path, frame)
|
|
print("Saved", path)
|
|
idx += 1
|
|
cap.release()
|
|
cv2.destroyAllWindows()
|
|
|
|
if __name__ == '__main__':
|
|
import sys, os
|
|
save_folder = None
|
|
if len(sys.argv) > 1:
|
|
save_folder = sys.argv[1]
|
|
os.makedirs(save_folder, exist_ok=True)
|
|
run_camera(save_folder)
|