在上次的笔记《OpenCV4学习笔记(36)——基于均值迁移(MeanShift)算法和直方图反向投影的目标移动跟踪》中,整理记录了一种针对目标的移动跟踪算法,主要是基于均值迁移和直方图反向投影来实现的。而今天要记录的笔记内容,依然是一种针对目标的移动跟踪算法——CAMShift目标移动跟踪算法,这种算法是基于MeanShift目标移动跟踪算法的改进。
CAMShift算法其实就是连续自适应的MeanShift算法,是对MeanShift 算法的改进,它能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视频中尺寸变化的目标。
CAMShift算法相比起MeanShift算法主要具有两个改进方向:
一是CAMShift算法会根据跟踪对象的大小变化来自动调整搜索窗口大小;
二是返回的检测目标信息更加完整,不仅包含位置信息,同时还包含了角度信息,也即返回的是目标所在的最小外接旋转矩形。
在OpenCV中提供了CamShift()
这个API来实现CAMShift算法,它的返回值为一个包含位置和角度的旋转矩形,其参数列表如下:
第一个参数probImage:输入的概率分布图像,也就是反向投影图像;
第二个参数window:目标位置的初始窗口;
第三个参数criteria:迁移终止条件,TermCriteria::EPS为迁移距离小于阈值时停止迁移,TermCriteria::COUNT为迁移迭代次数达到设定的最大值时停止迁移,可以两者同时使用。
下面看一下具体的代码演示:
VideoCapture capture;
capture.open("D:\\opencv_c++\\opencv_tutorial\\data\\images\\balltest.mp4");
//capture.open(0);
if (!capture.isOpened())
{
return 0;
}
//提取第一帧图像中ROI区域并将其转化为HSV图像
Mat first_image, first_hsv, roi_image, roi_hsv;
capture.read(first_image);
Rect roi_rect = selectROI("first_image", first_image, false, false);
roi_image = first_image(roi_rect).clone();
cvtColor(roi_image, roi_hsv, COLOR_BGR2HSV);
//计算ROI图像的直方图
Mat roi_hist;
int dims = 2;
int channels[2] = {
0,1 };
int histSize[2] = {
180,255 };
float ranges_