当检测到一张脸或多张脸时触发 cv2.imwrite
Trigger cv2.imwrite when a face or multiple faces are detected
在 Ubuntu 16.04 中,我正在尝试检测实时视频中的人脸并使用 OpenCV 和 Python 保存该图像。具体来说,我只想为检测到的每张脸保存一张图像,直到我按下 'q'。因此,对于检测到的每一张不同的脸,都会拍摄另一张照片。在下面的代码中,脚本每秒拍摄一张照片,直到我退出。
import cv2
# Import the cascade for face detection
face_cascade = cv2.CascadeClassifier('data/haarcascades/haarcascade_frontalface_default.xml')
# Access the webcam (every webcam has a number, the default is 0)
video = cv2.VideoCapture(0)
num = 0
while True:
# Capture frame-by-frame
ret, frame = video.read()
# Detect faces in video
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# Draw rectangles around faces
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
# Display the image
cv2.imshow('Video', frame)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imwrite('opencv'+str(num)+'.jpg',frame)
num = num+1
# Press q for exit
if cv2.waitKey(1) & 0xFF == ord('q'):
# Write frame in file
break
video.release()
cv2.destroyAllWindows()
有什么建议吗?
正如@Silencer 评论的那样,答案取决于您与 "different face" 相关联的含义。
如果你想真正将人脸识别为人:一种可能是实际创建一个检测到的人脸(或其特征)的数据库,然后将后续帧中的人脸与数据库中的人脸进行比较.在这种情况下,您需要一种执行人脸识别的算法。 OpenCV 和 dlib 有用于此任务的库。
如果您只想为给定面孔在相机前的每次出现记录一张照片:记录程序运行时检测到的第一组面孔的大小和位置 运行,然后检查以下帧是否包含大小和位置相似的人脸(帧速率必须很高才能起作用)。在这种情况下,您需要一种跟踪算法来正确匹配人脸。如果一张脸从场景中消失,稍后又出现,它会被再次捕获。
在 Ubuntu 16.04 中,我正在尝试检测实时视频中的人脸并使用 OpenCV 和 Python 保存该图像。具体来说,我只想为检测到的每张脸保存一张图像,直到我按下 'q'。因此,对于检测到的每一张不同的脸,都会拍摄另一张照片。在下面的代码中,脚本每秒拍摄一张照片,直到我退出。
import cv2
# Import the cascade for face detection
face_cascade = cv2.CascadeClassifier('data/haarcascades/haarcascade_frontalface_default.xml')
# Access the webcam (every webcam has a number, the default is 0)
video = cv2.VideoCapture(0)
num = 0
while True:
# Capture frame-by-frame
ret, frame = video.read()
# Detect faces in video
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# Draw rectangles around faces
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
# Display the image
cv2.imshow('Video', frame)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imwrite('opencv'+str(num)+'.jpg',frame)
num = num+1
# Press q for exit
if cv2.waitKey(1) & 0xFF == ord('q'):
# Write frame in file
break
video.release()
cv2.destroyAllWindows()
有什么建议吗?
正如@Silencer 评论的那样,答案取决于您与 "different face" 相关联的含义。
如果你想真正将人脸识别为人:一种可能是实际创建一个检测到的人脸(或其特征)的数据库,然后将后续帧中的人脸与数据库中的人脸进行比较.在这种情况下,您需要一种执行人脸识别的算法。 OpenCV 和 dlib 有用于此任务的库。
如果您只想为给定面孔在相机前的每次出现记录一张照片:记录程序运行时检测到的第一组面孔的大小和位置 运行,然后检查以下帧是否包含大小和位置相似的人脸(帧速率必须很高才能起作用)。在这种情况下,您需要一种跟踪算法来正确匹配人脸。如果一张脸从场景中消失,稍后又出现,它会被再次捕获。