我正在通过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中,当没有对象可追踪时,我也遇到程序卡住的问题。后来我解决了。

解决问题的方法:

1)首先计算meanShift,该平均值返回收敛所需的迭代次数。
2)如果(iteration_meanShift!= 0),则计算CamShift并返回bounding_box + frame。否则,仅返回框架。

也就是说,当且仅当meanshift非零时,才计算camshift,否则不计算camshift。

08-16 01:09