【问题标题】:Occlusion with camshift凸轮移位闭塞
【发布时间】:2014-09-22 12:06:29
【问题描述】:

我正在通过 camshift 算法进行对象跟踪。目前我正在使用内置的 opencv 代码,其中我无法处理遮挡问题。

  hsv = cv2.cvtColor(self.frame, cv2.COLOR_BGR2HSV)
  mask = cv2.inRange(hsv, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
  prob = cv2.calcBackProject([hsv], [0], self.hist, [0, 180], 1)
  cv2.imshow('prob_0',prob)
  prob &= mask
  cv2.imshow('prob',prob)
  term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
  track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)

我的问题是,在这段代码中,当我的红球对象超出相机的视野或者我用手盖住球的某个部分时,它会崩溃并给出以下错误:

   track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)
   error: ..\..\..\..\opencv\modules\video\src\camshift.cpp:80: error: (-5) Input           
   window has non-positive sizes in function cvMeanShift

这是因为我的 cv2.Camshift -> 参数“prob”没有与我的球对应的任何值(prob 是获得的包含阈值球的二进制图像)

在这种情况下,我有一个处理遮挡的想法。这是我将球矩阵存储在全局变量中,如果我的相机的当前帧无法获取球矩阵,那么它应该使用全局变量而不是它,直到它找不到并跟踪球。那么如何在给定的代码中应用这个逻辑呢?

那么任何人都可以帮助我如何处理这种球情况下的遮挡。

【问题讨论】:

    标签: opencv image-processing occlusion video-tracking


    【解决方案1】:

    只需使用 try catch 块或简单的 if 语句。仅当变量prob 具有有效值时才执行 CamShift 语句

     if not prob:
    //do nothing or print an error statement since ball is occluded
    else:
    track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)
    

    【讨论】:

    • prob 是一个数组。所以数组的真值将是模棱两可的。我试过这个 beofer..没用
    【解决方案2】:

    在 OpenCV 中,当没有要跟踪的对象时,我遇到了程序卡住的相同问题。后来我解决了。

    解决它:

    1) 首先计算meanShift,它返回收敛所需的迭代次数。 2) if (iteration_meanShift != 0),则计算CamShift并返回bounding_box+frame。否则,只返回帧。

    即当且仅当 meanshift 不为零时,计算 camshift,否则不计算 camshift。

    【讨论】:

      【解决方案3】:

      确保self.track_window 不是None

      【讨论】:

        猜你喜欢
        • 2017-05-16
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 2014-10-01
        相关资源
        最近更新 更多