opencv - 凸轮移位闭塞

标签 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 是获得的由阈值球组成的二进制图像)

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

谁能帮我解决这个球情况下的遮挡问题。

最佳答案

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

解决这个问题:

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

即当且仅当meanshift非零时,计算凸轮偏移,否则不计算凸轮偏移。

关于opencv - 凸轮移位闭塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25043761/

相关文章:

python - 图像识别中的预处理

python - 我怎样才能柔化这张图片的边缘

windows - 建立cvhaartraining.lib

opencv - 视频帧中真实对象的注册

opencv - 在OpenCV HoughLines中检测多条线

c++ - OpenCV:无法从视频中获取帧率

python - 带有 Python 的 OpenCV 是否需要 X Windows?

c++ - videowriter 功能不使用 opencv-3.0.0 保存文件

c++ - C/C++ OpenGL 遮挡剔除