【问题标题】:How to keep track of different contours in opencv python如何在opencv python中跟踪不同的轮廓
【发布时间】:2015-04-09 01:52:11
【问题描述】:

我正在尝试使用 python 中的 opencv 从录制的视频中跟踪对象。我想在每个可见对象出现时为其赋予一个唯一的对象 nr。例如,一个对象进入屏幕并获得 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

【问题讨论】:

  • 您是否考虑过保留对对象旧(即前一帧)质心位置的引用,并将新检测到的对象的位置与那些旧引用进行比较?
  • 是的,我有。我现在确实能够按可见的顺序保持对象,但是当 obj1 进入屏幕然后 obj2 进入并离开并且 obj3 进入和离开时,它仍然得到名称 obj2。我想我可能能够在几个小时内编写此代码,但我认为必须有一个更简单的解决方案。感谢您的建议。

标签: python opencv tracking contour


【解决方案1】:

您要跟踪什么样的对象?如果很容易区分,可以尝试收集对象的一些特征,并检查具有相似特征的对象是否较早出现。很难说哪种功能最适合您的情况,但您可以尝试以下操作:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2014-01-22
    • 2018-09-09
    • 2014-07-12
    相关资源
    最近更新 更多