使用python

时间:2018-04-10 14:13:15

标签: python opencv

我正在使用OpenCV跟踪器在视频中执行面部跟踪,并且每隔几帧就会有一个面部检测器。如果面部检测器检测到面部,我想用"检测到"更新跟踪器。边界框。我看到有一个选项可以在C ++实现中输入一个Rect,但由于某些原因不在python实现中as written in the opencv documentation。使用dlib' s correlation_tracker时,这也是一个选项。

目前,我只能使用边界框初始化跟踪器,但不能用Python中的一个更新它。如果我的跟踪器已经偏离了最初的面部,它正在跟踪,我无法将它带回来#34;即使我知道脸在哪里(使用我的面部探测器)。有没有办法在python中执行此操作(例如,我应该杀死当前的跟踪器并使用检测到的边界框启动另一个跟踪器)?

1 个答案:

答案 0 :(得分:2)

我一直在寻找相同的东西,每次成功检测到一次,我都会通过重新创建跟踪器来找到问题的解决方案。请检查以下代码。如果不清楚,请随时询问详细信息:

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()