如何在opencv python中跟踪不同的轮廓

时间:2015-02-09 10:40:38

标签: python opencv tracking contour

我正在尝试使用录制的视频跟踪python中的opencv对象。我希望在每个可见对象出现时给它一个唯一的对象。例如,一个对象进入屏幕并获得nr1,然后第二个对象加入第一个并获得nr2,然后第一个对象离开屏幕但第二个仍然可见,仍然获得对象nr2而不是1(是唯一的对象)。我无法找到有关如何在线执行此操作的任何信息。任何帮助(包括代码)表示赞赏。

到目前为止我编写的代码用于获取轮廓和绘制对象编号:

cap = cv2.VideoCapture("video.mov")
while True:
    flag, frame = cap.read()
    cv2.drawContours(frame, contours, -1, (255,0,0) ,1)
    for i in range(len(contours)):
        cnt = contours[i]
        cnt_nr = i+1
        x,y,w,h = cv2.boundingRect(cnt)
        cv2.putText(frame, str(cnt_nr), ((x+w)/2,(y+h)/2), cv2.FONT_HERSHEY_PLAIN, 1.8, (0,0,0))
    cv2.imshow("Tracked frame",frame)
    k = cv2.waitKey(0)
    if k == 27: 
        cv2.destroyAllWindows()
        break

1 个答案:

答案 0 :(得分:1)

您想要追踪什么样的物品?如果很容易区分它们,您可以尝试收集对象的某些功能,并检查具有相似功能的对象是否更早出现。在您的情况下,很难说哪种功能最好,但您可以尝试以下方法:

  • 轮廓尺寸,面积和长度(或比率:面积/长度或其他)
  • convex hull对象及其长度(与上述相同 - 您也可以尝试比例)
  • 对象颜色(平均颜色) - 如果可以更改照明,请考虑仅使用HSV颜色空间中的H通道
  • 一些更复杂的 - 对象内部边缘的“总和”(在对象上使用一些边缘检测器并只计算结果图像的总和)

其他解决方案是使用为此类任务设计的更强大的工具 - 对象跟踪器。在我的一个项目中,我正在使用TLD tracker并且它工作正常,另一种选择是使用CMT tracker,这可能对你更好,因为它是用Python编写的。请注意,对于跟踪多个对象,您将需要多个跟踪器对象(或找到能够跟踪多个不同对象的跟踪器)。