如何使用opencv实现人脸检测和跟踪?

时间:2020-08-09 04:45:01

标签: opencv image-processing computer-vision face-detection opencv-python

我正在尝试通过OpenCV实现人脸检测和多人脸跟踪,以使用OpenCV函数cv2.dnn.readNetFromCaffe(prototxt,caffe)进行检测,并提供了预先训练的人脸检测模型并用于跟踪cv2.MultiTracker_create()。问题是我能够正确检测人脸并绘制边界框,但与追踪人脸结合使用时无法正确追踪。

import cv2
import numpy as np
import time

trackerName = "kcf"
OPENCV_OBJECT_TRACKERS = {
    "csrt": cv2.TrackerCSRT_create,
    "kcf": cv2.TrackerKCF_create,
    "boosting": cv2.TrackerBoosting_create,
    "mil": cv2.TrackerMIL_create,
    "tld": cv2.TrackerTLD_create,
    "medianflow": cv2.TrackerMedianFlow_create,
    "mosse": cv2.TrackerMOSSE_create
}


prototxt = r"C:\Python27\simple-object-tracking\deploy.prototxt"
caffe = r"C:\Python27\simple-object-tracking\res10_300x300_ssd_iter_140000.caffemodel"
flag = 0
cap =cv2.VideoCapture(0)



while True:

    _,frame = cap.read()
    (h,w) = frame.shape[:2]

    #prev = int(time.time())
    
    if(int(time.time())%5 == 0) or flag == 0:
        net = cv2.dnn.readNetFromCaffe(prototxt,caffe)
        blob = cv2.dnn.blobFromImage(cv2.resize(frame,(300,300)),1.0,(299,299),(104.0,177.0,123.0))
        net.setInput(blob)
        detections = net.forward()
        trackers = cv2.MultiTracker_create()
        flag = 1
        prev = 0
        boxes = []
        for i in range(0,detections.shape[2]):
            confidence = detections[0,0,i,2]

            if confidence > 0.5:
                box = detections[0,0,i,3:7] * np.array([w,h,w,h])
                boxes.append(box.astype("int"))
                box = (int(box[0]),int(box[1]),int(box[2]),int(box[3]))
                print(box)
                tracker = OPENCV_OBJECT_TRACKERS[trackerName]()
                cv2.putText(frame,str(confidence*100), (100,50),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)                
                trackers.add(tracker, frame, box)



    (success,boxes) = trackers.update(frame)
     

    #print(boxes)
    if success:    
        for box in boxes:
                 (startX,startY,endX,endY) = box.astype("int")
                 print("new co-or",startX,startY,endX,endY)
                 text = "{:.2f}%".format(confidence * 100)
                 y = startY - 10 
                 cv2.rectangle(frame, (startX, startY), (endX, endY),(0, 0, 255), 2)
                 cv2.putText(frame, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
                 pstartx = startX
                 pstarty = startY
    frame = cv2.flip(frame,1)
    cv2.imshow('frame',frame)
    
    k = cv2.waitKey(5) & 0xFF

    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

检测期间的输出:

Output during detection

在跟踪和移动对象时输出:

Output while tracking and moving the object

0 个答案:

没有答案