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实现视频对象跟踪相关推荐

  1. 目标跟踪算法--Camshift 和Meanshift

    算法原理: meanshift原理: meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优.它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止.但 ...

  2. mil跟踪算法matlab,几种目标跟踪算法性能比较

    这是我自己的跟踪算法 %%******************************************* 实验设置 ************************************** ...

  3. 【目标跟踪 SOT】SiamFC -用于对象跟踪的全卷积孪生网络

    SiamFC - 全卷积孪生网络 $背景知识 SOT(单目标跟踪)和MOT(多目标跟踪)的思想是,在视频中的某一帧中框出你需要跟踪目标的bounding box,在后续的视频帧中,无需你再检测出物体的 ...

  4. OpenCV 实时对象跟踪(质心跟踪)

    本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...

  5. C++ OpenCV视频操作之CamShift跟踪算法

    前言 CamShift算法,全称是 Continuously AdaptiveMeanShift,顾名思义,它是对Mean Shift 算法的改进,能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视 ...

  6. opencv视频分析与对象追踪之CAMSHIFT对象跟踪

    原理 CamShift算法,全称是 Continuously AdaptiveMeanShift,顾名思义,它是对Mean Shift 算法的改进,能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视 ...

  7. 视频操作_02视频追踪:meanshift算法+Camshift算法

    1.meanshift 1.1原理 meanshift算法的原理很简单.假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中. 如下图: 最开始的 ...

  8. OpenCV 3 Tracking API目标跟踪学习笔记——定义、物体跟踪常用算法、demo

    今天开始接触目标跟踪 本文翻译自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/#opencv-tracking ...

  9. 目标跟踪算法_Camshift函数(学习笔记)

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

最新文章

  1. 自已写的几个分页的存储过程
  2. Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单
  3. 【电力负荷预测】基于matlab Elman神经网络电力负荷预测【含Matlab源码 279期】
  4. XDroid 轻量级的Android快速开发框架
  5. 卫星影像0.3米到2米精度样例参照图
  6. 人工智能文本生成器将如何影响写作行业
  7. Win10 如何在系统内用cmd命令查看系统详细信息
  8. mysql获取最大天数_mysql如何查询两个日期之间最大的连续登录天数
  9. Java面试题--dalao总结版
  10. 图神经网络(一):综述
  11. 平台经济中国案例研究——网易云平台
  12. sqlserver设计表不允许保存更改,阻止保存要求重新创建表的更改
  13. 基于Springboot的漫画网站设计与实现的源码+文档
  14. C#时间显示格式(12小时制VS24小时制)
  15. Matlab可视化四维数据
  16. MxNet系列——how_to——new_op
  17. 联想笔记本重装win11系统后恢复fn+q热键
  18. 动画旋转360度位置不变
  19. 阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
  20. 【AAAI 2021】时间序列相关论文汇总

热门文章

  1. 观《优矿量化分析师日记-讲师李涛涛》笔记
  2. 光中断器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  3. 自动驾驶:2022 apollo day 观后感(一)
  4. php做异步回合制,请问有哪些游戏属于半回合制游戏?
  5. 使用Visual Studio 2010编译WebKit
  6. dayz正版服务器在哪,dayz独立版盗版服务器(盗版dayz怎么创建服务器)
  7. golang函数式编程之柯里化
  8. ueditor编辑器html模式下无法保存内容
  9. 手机移动端返回顶部js代码demo效果示例(整理)
  10. Windows无法上网-netsh winsock reset