使用camshift遮挡

时间:2014-07-30 17:59:52

标签: opencv image-processing occlusion video-tracking

我正在通过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是获得的由阈值球组成的二进制图像)

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

所以任何人都可以帮我解决这种情况下的遮挡问题。

3 个答案:

答案 0 :(得分:2)

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

解决它:

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

即。当且仅当换档非零时,计算换档,否则不计算换档。

答案 1 :(得分:0)

只需使用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)

答案 2 :(得分:0)

确保self.track_window不是None。 感谢