OpenCV连续自适应跟踪算法CAMShift实现视频对象跟踪
1、概述
案例:使用OpenCV的CAMShift算法实现视频中对象跟踪
算法API介绍:
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
CamShift( InputArray probImage, CV_IN_OUT Rect& window,TermCriteria criteria );
probImage:要跟踪对象的直方图反向投影矩阵
window:跟踪的目标区域
criteria:迭代停止条件
算法实现步骤:
1.实例化VideoCapture
2.使用VideoCapture的open方法打开视频
3.while循环读取视频帧
4.检测是否是读取的第一帧,如果是第一帧则对第一帧选取roi区域,并生成roi区域的直方图矩阵
5.否则就使用计算过的直方图数据制作脂肪头的反射投影矩阵
6.使用CAMShift算法跟踪对象,并输入跟踪对象矩阵
7.使用跟踪矩阵数据绘制外接圆
8.循环4~7步骤,直到视频帧读取结束
2、代码示例
CAM_Shift_Video_Object_Tracking::CAM_Shift_Video_Object_Tracking(QWidget *parent): MyGraphicsView{parent}
{this->setWindowTitle("CAMShift对象跟踪");QPushButton *btn = new QPushButton(this);btn->setText("选择视频");connect(btn,&QPushButton::clicked,[=](){choiceVideo();});
}void CAM_Shift_Video_Object_Tracking::choiceVideo(){path = QFileDialog::getOpenFileName(this,"请选择视频","/Users/yangwei/Downloads/",tr("Image Files(*.mp4 *.avi)"));qDebug()<<"视频路径:"<<path;videoObjectTracking(path.toStdString().c_str());
}void CAM_Shift_Video_Object_Tracking::videoObjectTracking(const char *filePath){VideoCapture capture;capture.open(filePath);if(!capture.isOpened()){qDebug()<<"打开视频失败";return;}bool isFirstRead = true;//是否读取的第一帧Mat frame;//视频帧图像Mat hsv;//hsv色彩空间图像数据Rect selection;//选中区域Mat mask;//颜色过滤的遮罩Mat hue;//h通道数据Mat hist;//图像直方图数据Mat backprojection;//直方图反向投影的输出float hrange[] = { 0, 180 };const float* hranges = hrange;int bins = 16;Mat drawImg = Mat::zeros(300, 300, CV_8UC3);//直方图就绘制在这个图像中while(capture.read(frame)){if(isFirstRead){//如果是第一帧就需要选取roi区域,并对selection填充数据Rect2d rect = selectROI(frame);selection.x = rect.x;selection.y = rect.y;selection.width = rect.width;selection.height = rect.height;qDebug()<<"第一帧已选取完成";}qDebug()<<"转HSV";//转换hsv色彩空间cvtColor(frame,hsv,COLOR_BGR2HSV);//使用inRange过滤像素
// inRange(hsv,Scalar(26,43,46),Scalar(34,255,255),mask);inRange(hsv,Scalar(13,30,32),Scalar(50,255,255),mask);//使用mixChanngles获取H通道的数据int channels[] = { 0, 0 };qDebug()<<"过滤H通道";hue = Mat(hsv.size(), hsv.depth());mixChannels(&hsv, 1, &hue, 1, channels, 1);if(isFirstRead){//如果是第一帧,就计算roi区域的直方图qDebug()<<"计算并绘制直方图";Mat roi(hue,selection);Mat maskRoi(mask,selection);calcHist(&roi,1,0,maskRoi,hist,1,&bins,&hranges);//将直方图数据归一化到0~255normalize(hist,hist,0,255,NORM_MINMAX);//绘制直方图数据int binw = drawImg.cols / bins;Mat colorIndex = Mat(1, bins, CV_8UC3);for (int i = 0; i < bins; i++) {colorIndex.at<Vec3b>(0, i) = Vec3b(saturate_cast<uchar>(i * 180 / bins), 255, 255);}cvtColor(colorIndex, colorIndex, COLOR_HSV2BGR);for (int i = 0; i < bins; i++) {int val = saturate_cast<int>(hist.at<float>(i)*drawImg.rows / 255);rectangle(drawImg, Point(i*binw, drawImg.rows), Point((i + 1)*binw, drawImg.rows - val), Scalar(colorIndex.at<Vec3b>(0, i)), -1, 8, 0);}}//对直方图执行反向投影(作为camshift函数会用到),作为输入calcBackProject(&hue,1,0,hist,backprojection,&hranges);//执行CAMShift跟踪backprojection &= mask;//此处是为了让结果更加精准RotatedRect trackBox = CamShift(backprojection,selection,TermCriteria((TermCriteria::COUNT | TermCriteria::EPS), 10, 1));//绘制roi区域的外接圆ellipse(frame,trackBox,Scalar(0,255,255),3);if(isFirstRead){isFirstRead= false;}imshow("frame",frame);imshow("hist",drawImg);int c = waitKey(1);if(c==27){break;}}capture.release();}
3、图像演示
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
OpenCV连续自适应跟踪算法CAMShift实现视频对象跟踪相关推荐
- 目标跟踪算法--Camshift 和Meanshift
算法原理: meanshift原理: meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优.它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止.但 ...
- mil跟踪算法matlab,几种目标跟踪算法性能比较
这是我自己的跟踪算法 %%******************************************* 实验设置 ************************************** ...
- 【目标跟踪 SOT】SiamFC -用于对象跟踪的全卷积孪生网络
SiamFC - 全卷积孪生网络 $背景知识 SOT(单目标跟踪)和MOT(多目标跟踪)的思想是,在视频中的某一帧中框出你需要跟踪目标的bounding box,在后续的视频帧中,无需你再检测出物体的 ...
- OpenCV 实时对象跟踪(质心跟踪)
本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...
- C++ OpenCV视频操作之CamShift跟踪算法
前言 CamShift算法,全称是 Continuously AdaptiveMeanShift,顾名思义,它是对Mean Shift 算法的改进,能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视 ...
- opencv视频分析与对象追踪之CAMSHIFT对象跟踪
原理 CamShift算法,全称是 Continuously AdaptiveMeanShift,顾名思义,它是对Mean Shift 算法的改进,能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视 ...
- 视频操作_02视频追踪:meanshift算法+Camshift算法
1.meanshift 1.1原理 meanshift算法的原理很简单.假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中. 如下图: 最开始的 ...
- OpenCV 3 Tracking API目标跟踪学习笔记——定义、物体跟踪常用算法、demo
今天开始接触目标跟踪 本文翻译自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/#opencv-tracking ...
- 目标跟踪算法_Camshift函数(学习笔记)
在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...
最新文章
- 自已写的几个分页的存储过程
- Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单
- 【电力负荷预测】基于matlab Elman神经网络电力负荷预测【含Matlab源码 279期】
- XDroid 轻量级的Android快速开发框架
- 卫星影像0.3米到2米精度样例参照图
- 人工智能文本生成器将如何影响写作行业
- Win10 如何在系统内用cmd命令查看系统详细信息
- mysql获取最大天数_mysql如何查询两个日期之间最大的连续登录天数
- Java面试题--dalao总结版
- 图神经网络(一):综述
- 平台经济中国案例研究——网易云平台
- sqlserver设计表不允许保存更改,阻止保存要求重新创建表的更改
- 基于Springboot的漫画网站设计与实现的源码+文档
- C#时间显示格式(12小时制VS24小时制)
- Matlab可视化四维数据
- MxNet系列——how_to——new_op
- 联想笔记本重装win11系统后恢复fn+q热键
- 动画旋转360度位置不变
- 阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
- 【AAAI 2021】时间序列相关论文汇总