我正在尝试通过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()
检测期间的输出:
在跟踪和移动对象时输出: