我有活体人脸检测的代码:
import cv2
class FaceRec:
# Enable camera
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 420)
# import cascade file for facial recognition
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
while True:
success, img = cap.read()
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Getting corners around the face
faces = faceCascade.detectMultiScale(imgGray, 1.3, 5) # 1.3 = scale factor, 5 = minimum neighbor
# drawing bounding box around face
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv2.imshow('face_detect', img)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyWindow('face_detect')
此代码使用网络摄像头来检测并在人脸进入框架时在人脸周围绘制一个框。但我希望它在检测到脸部后运行代码块。我该怎么做呢?
我尝试合并 while 循环,但循环中的代码在检测到面部之前运行,而我希望它仅在检测到面部时运行。
cv2.CascadeClassifier.detectMultiScale
上的 opencv 文档指出该函数:
检测输入图像中不同尺寸的物体。检测到的对象以矩形列表的形式返回。
因此,当没有检测到人脸时,返回的矩形列表为空。
您的代码可以像这样简单
while True:
...
faces = faceCascade.detectMultiScale(imgGray, 1.3, 5)
if faces : # check if faces is not empty
... # do stuff
显然请记住,必须在每个循环中执行测试以断言网络摄像头前面是否仍有人脸。