我正在使用OpenCV跟踪器在视频中执行面部跟踪,以及每隔几帧进行一次面部检测器。如果人脸检测器检测到人脸,我想使用"检测到"边界框更新跟踪器。我看到有一个选项可以在C++实现中输入 Rect,但由于某种原因不在 opencv 文档中编写的 python 实现中。这也是使用 dlib correlation_tracker时的一种选择。
目前,我只能使用边界框初始化跟踪器,而不能在 Python 中使用边界框更新它。 如果我的智能设备偏离了它正在跟踪的初始面部,即使我知道面部现在在哪里(使用我的面部检测器(,我也无法"将其带回"。有没有办法在python中做到这一点(例如,我应该杀死当前的跟踪器并使用检测到的边界框初始化另一个跟踪器(?
我一直在寻找同样的东西,我发现自己可以通过每次成功检测时重新创建跟踪器来解决问题。请检查以下代码。如果有什么不清楚的地方,请随时询问详细信息:
import cv2 as cv
cap = cv.VideoCapture(0)
face_front_cascade = cv.CascadeClassifier("haarcascade_frontalface_alt.xml")
tracker = cv.TrackerKCF_create()
bbox = ()
while True:
ret,frame = cap.read()
#press S to capture the face
if cv.waitKey(20) & 0xFF == ord("s"):
frame_gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
face = face_front_cascade.detectMultiScale(frame_gray, scaleFactor=1.5, minNeighbors=3)
for (x, y, w, h) in face:
colour = (0,0,255)
stroke = 20
cv.rectangle(frame,(x,y),(x+w,y+h), colour, stroke)
bbox = (x,y,w,h)
tracker = cv.TrackerKCF_create() #overwrite old tracker
#trace face and draw box around it
if bbox:
tracker.init(frame, bbox)
ret, bbox = tracker.update(frame)
if ret:
p1 = (int(bbox[0]), int(bbox[1]))
p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
cv.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
#show result
cv.imshow("frame",frame)
#press ESC to exit
if cv.waitKey(20) & 0xFF ==27:
break
cap.release()
cv.destroyAllWindows()