使用具有IP摄像机的haarcascade_frontalface_default.xml进行实时流面部检测的代码可以正常工作,但是不需要的图像会捕获并保存在同一文件夹中,我不希望出现随机空白空间的不需要的图像。我使用haarcascade_frontalface_default.xml两次仍然是相同的结果,所以给我一个解决方案
import cv2
import datetime
import os
import random
if not os.path.exists('./dataset'):
os.makedirs('./dataset')
cap =
cv2.VideoCapture("rtsp://admin:admin@192.168.0.7:554/cam/realmonitor?
channel=1&subtype=0")
face_cascade =
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
def getfilename():
x = datetime.datetime.now()
filename =
x.strftime("%d")+x.strftime("%m")+x.strftime("%Y")+x.strftime("%H")+
x.strftime("%M")+x.strftime("%S")+"-
"+str(random.randint(1,300))+".jpg"
return filename
while 1:
ret, img = cap.read()
faces = face_cascade.detectMultiScale(img, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = img[y:y+h, x:x+w]
cv2.imwrite("E:/python_pro/dataset/"+getfilename(),roi_gray)
cv2.imshow('img',img)
k = cv2.waitKey(1) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
答案 0 :(得分:1)
首先,行face_cascade =
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
表示您正在初始化面部检测器,但这并不意味着您正在进行面部检测。因此,循环内的两行是不必要的。函数detectMultiScale是进行人脸检测的功能。因为设置了分类器MinNeigbours = 5的置信度,所以您得到了不需要的图像。通过将MinNeigbours增加到15并尝试,可以避免误报。
ret, img = cap.read()
faces = face_cascade.detectMultiScale(img, 1.3, 15)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = img[y:y+h, x:x+w]
cv2.imwrite("E:/python_pro/dataset/"+getfilename(),roi_gray)
cv2.imshow('img',img)
k = cv2.waitKey(1) & 0xff
if k == 27:
break
您可以在how to limit number of faces detected by haar cascades上查看我的答案 也。参阅官方文件 https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html