[OpenCV] Camshiftdemo 目标跟踪

1. 导言

这两天又有个机会(为什么要说又呢?)要用到OpenCV中的camshift tracking。简单记录一下,算是这篇目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)文章的补充


2. 工作流程

2.1 使用方法

  • trackObject为0表示不跟踪,为1表示继续跟踪;鼠标选择完(新)跟踪区域后trackObject为-1, 根据新窗口准备跟踪的数据(颜色空间转换,直方图等)---这些上面的代码注释里都有提到
  • 刚读源码才发现可以按p暂停后再选跟踪目标---这个逻辑还挺有用


2.2 涉及的源码有:

$OPENCV_HOME/samples/cpp/camshiftdemo.cpp

$OPENCV_HOME//modules/video/src/camshift.cpp:总共4个函数

  • cv::CamShift
  • cv::meanShift
  • cvCamShift
  • cvMeanShift


2.3 呼叫流程:

cv::CamShift(...)-->cvCamShift(...)-->cvMeanShift(...)

  • i) cvCamShift会调整输入窗口大小。具体是四个矩形边各自向外扩张TOLERANCE像素。越界的情况会自动处理。TOLERANCE hard coded为10。
  • ii)对扩展后的矩形跟踪区域计算moments。如果零阶矩小于DBL_EPSILON,则直接返回-1。
  • iii)DBL_EPSILON: 前28位在本机上打印出来是这样:0.0000000000000002220446049250

注意之前cv::CamShift初始化了一个CvConnectedComp comp 为全0值,并传入cvCamShift。cvCamShift返回后再用这个comp改变传入cv::CamShift的最最初始的跟踪窗口。

所以上面如果返回-1,则初始窗口(camshiftdemo中的trackWindow)会变成0。在下一帧时会抱如下错误:

camshift.cpp:81: error: (-5) Input window has non-positive sizes in function cvMeanShift


这也算是一个小bug吧。可以出现这种情况就提示不再跟踪任何窗口,或在返回-1前把当前跟踪窗口(其m00为零)赋给_comp,这样跟踪窗口应该一直维持在那个小区域,直到选取新的区域---我这么试了,又出drawing的错误,应该是区域太小了,没法fit elipse。 whatever啦。。。


每一帧的处理中,基本上有三个地方可能改变初始的跟踪窗口(注意这里初始窗口是针对每一帧而言,而不是鼠标选定的最开始的初始窗口)

  1. cvMeanshift本身最终收敛的结果
  2. cvCamShift中,cvMeanShift之后窗口扩展,也就是上面的i)
  3. 属于CamShift本身的根据二阶矩调整跟踪窗口大小的算法


3. The End






你可能感兴趣的:([OpenCV] Camshiftdemo 目标跟踪)