如何在实时视频流检测到人脸时将多余的图像删除,裁剪并保存在文件夹中

时间:2019-01-11 06:56:30

标签: python opencv haar-classifier

使用具有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()

1 个答案:

答案 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