基于mean-shift的简单目标跟踪
一、概述
作为即将踏入图像识别、目标跟踪领域的一名研究生,先从基础的学起,本文采用了经典的mean-shift算法,思路简单,实现的思路来源于一个网址:http://zhidao.baidu.com/link?url=v2PlqAHX45kjCWJUnSsZYBwHkPVCX8vp6oIZnRXV7IKG0phmuy0vwQ02_SRBgK1OLieVctpFJHR1cGoaxlDAIK,得到的跟踪结果较为勉强。
meanshift算法是一种密度函数梯度估计的非参数方法,通过迭代寻优找到概率分布的极值来定位目标。算法的步骤如下:(1)选择搜索窗(2)计算得窗口的重心(3)将窗口的重心设置在计算出的重心处(4).移动搜索窗的中心到重心,如果移动距离大于预设的固定阈值,则重复2)3)4),直到搜索窗的中心与质心间的移动距离小于预设的固定阈值,或者循环运算的次数达到某一最大值,停止计算。关于meanshift的收敛性证明可以google相关文献。
Opencv中实现该算法的函数是cvMeanShift( const CvArr* prob_image ,CvRect window, CvTermCriteria criteria, CvConnectedComp* comp) ,prob_image为单通道图像,应为由只含目标的图像经过计算H分量直方图、计算直方图的方向投影得到的概率图像,window为指定搜索初始位置的窗口,criteria为终止条件,主要由mean-shift移动的最大迭代次数和可视为窗口位置收敛的最小移动距离组成,comp->rect中包含收敛后搜索窗口的位置,而comp->area包含了窗口内部所有像素和。
二、代码实现
具体代码
我的代码是基于VS2010+ OpenCV2.4.6的。代码可以读入视频,也可以读摄像头,两者的选择只需要在代码中稍微修改即可。无论选择何种,首先打开了视频后,需要由鼠标手动画圆选择视频中要跟踪的目标,由于我的摄像头分辨率低,采用手机拍摄视频后读入。跟踪目标的纹理与周围纹理差别较大时,效果较好吧。
具体代码:
#include "cv.h"
#include "highgui.h"
#include <cxcore.h>void my_mouse_callback(int event ,int x,int y,int flags ,void* param);
void getTarget(IplImage* src ,CvRect rect); //得到目标图像bool drawing_circle = false;
int circle_r = 0;
CvPoint circlr_center =cvPoint(0,0);
int circle_x = 0;
int circle_y = 0;
bool flag = false;
int getting_target = 0;int main()
{CvCapture* capture = cvCreateFileCapture("testMoving.avi");if (!capture){printf("Can not open the file./n");return -1;}IplImage* frames ;frames = cvQueryFrame(capture);cvNamedWindow("Test Meanshift" ,1);cvSetMouseCallback( "Test Meanshift" ,my_mouse_callback,(void*)frames );CvRect rect;IplImage* pFrames = cvCreateImage(cvGetSize(frames) ,frames->depth ,3);CvHistogram* hist;IplImage* result=cvCreateImage(cvGetSize(frames),IPL_DEPTH_8U,1);cvZero(result);CvConnectedComp comp ;IplImage* srcImage =cvCreateImage(cvGetSize(frames),IPL_DEPTH_8U,1);CvBox2D box;while(1){if(flag){cvCircle(frames ,circlr_center ,circle_r ,CV_RGB(255 ,0,0),3,8,0);rect = cvRect(circlr_center.x-circle_r,circlr_center.y-circle_r,2*circle_r ,2*circle_r);if(getting_target){pFrames = cvCloneImage(frames);getTarget(pFrames ,rect);IplImage* target_hsv =cvCreateImage( cvGetSize(pFrames), IPL_DEPTH_8U, 3 );IplImage* target_hue =cvCreateImage( cvGetSize(pFrames), IPL_DEPTH_8U, 1 );cvCvtColor(pFrames,target_hsv,CV_BGR2HSV); //转化到HSV空间cvSplit( target_hsv, target_hue, NULL, NULL, NULL ); //获得H分量IplImage* h_plane=cvCreateImage( cvGetSize(target_hsv),IPL_DEPTH_8U,1 );int hist_size[]={255}; //将H分量的值量化到[0,255]float h_ranges[] ={0,360};float* ranges[] = {h_ranges}; //H分量的取值范围是[0,360)hist= cvCreateHist(1,hist_size, CV_HIST_ARRAY ,ranges ,1);cvCalcHist(&target_hue, hist, 0, NULL); //计算得直方图histgetting_target = 0;cvReleaseImage(&target_hsv);cvReleaseImage(&target_hue);}cvCvtColor(frames ,srcImage ,CV_BGR2GRAY);cvCalcBackProject(&srcImage,result,hist);cvMeanShift(result ,rect ,cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS ,20 ,0.3),&comp ); circlr_center = cvPoint(comp.rect.x+0.5*comp.rect.width ,comp.rect.y+0.5*comp.rect.height);circle_r = comp.rect.width/2 ;}cvShowImage( "Test Meanshift" ,frames);if(cvWaitKey(33) == 27)break;frames = cvQueryFrame(capture);}return 0;}void my_mouse_callback(int event ,int x,int y,int flags ,void* param)
{IplImage* images = (IplImage* )param;switch(event){case CV_EVENT_MOUSEMOVE:{if (drawing_circle == true){circlr_center = cvPoint((x+circle_x)/2 ,(y+circle_y)/2);circle_r = (x-circle_x)/2;}}break;case CV_EVENT_LBUTTONDOWN:{drawing_circle = true ;circle_x = x;circle_y = y;}break;case CV_EVENT_LBUTTONUP:{drawing_circle = false;flag = true ;getting_target = 1;}break;}}void getTarget(IplImage* src ,CvRect rect)
{for(int i=0;i<src->width ;i++)for(int j = 0; j<src->height ;j++){if( i<rect.x || i>(rect.x+rect.width)){if( j<rect.y ||j>(rect.y+rect.height))cvSet2D(src ,j , i,cvScalarAll(255));}}
}
三、结果
跟踪结果令人大致满意,但当照射到物体上的光照发生变化,或者跟踪物体保持不平衡时容易时,跟丢目标,这也是缺陷吧!!
基于mean-shift的简单目标跟踪相关推荐
- 基于嵌入式设备的 单目标跟踪算法
基于嵌入式设备的单目标跟踪实现 最近基于嵌入式设备(Khadas Vim3)做了一套单目标跟踪算法,跟踪效率可以做到每秒25帧左右. 算法运行耗时记录 time is:37.6241 ms time ...
- MATLAB实现简单目标跟踪
MATLAB实现简单目标跟踪 预处理:中值滤波: 目标检测:二值化 后处理:形态学滤波或者连通性处理 目标跟踪:计算形心 clear all; close all; %预处理-中值滤波 t = imr ...
- kcf 跟随_基于YOLO和KCF的目标跟踪算法研究
1. 引言 随着AI技术的不断发展,其子领域计算机视觉技术也获得了突飞猛进的进步,计算机视觉即通过机器实现"人眼"对事物的测量和判别能力.目前,计算机视觉技术主要应用于智能视频监控 ...
- 基于均值漂移的视频目标跟踪算法的研究
背景介绍 计算机视觉作为一门多技术融合的学科,涉及模式识别和视频图像处理等众多领域.基于视频的目标检测与跟踪技术是计算机视觉领域中最主要的研究方向之一,它是智能监控.移动机器人视觉导航以及人机交互等应 ...
- 【项目实战课】基于Pytorch的SiameseFC通用目标跟踪实战
欢迎大家来到我们的项目实战课,本期内容是<基于Pytorch的SiameseFC目标跟踪实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实 ...
- python 粒子滤波目标追踪_Python实现基于相关滤波的单目标跟踪算法
最近在阅读一些单目标跟踪的算法论文,主要看了一系列基于相关滤波的算法,尝试着用python实现了其中一些比较经典的算法,地址在https://github.com/wwdguu/pyCFTracker ...
- opencv3/C++ 使用Tracker进行简单目标跟踪
简介 MIL: TrackerMIL 以在线方式训练分类器将对象与背景分离;多实例学习避免鲁棒跟踪的漂移问题. OLB: TrackerBoosting 基于AdaBoost算法的在线实时对象跟踪.分 ...
- 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV
实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...
- HO-MHT (Hypothesis Oriented Multi-Hypothesis Target Tracking/基于假设的多假设目标跟踪算法)
面向假设的多假设目标跟踪算法-Python3.X实现 前言 1. tracker.py 1.1 _normalize_log_sum(items) 1.2 LocalHypothesis类 1.2.1 ...
最新文章
- Matlab中的lsqcurvefit函数的使用
- 轻松两步,我在 SpringBoot 服务上实现了接口限流
- 机械转嵌入式还是java,机械硕士转嵌入式后悔吗?
- matplotlib.pyplot.scatter API
- 基于ASP.NET的comet简单实现
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...
- android textview doubleclick,Android的TextView的双击事件监听
- android textview密文,TextView 明密文处理
- .NET组件和COM组件之间的相互操作方法
- 拯救我们的健康:戒烟应用大盘点
- APS生产计划排程(Production Planning and Scheduling)
- php人民币转换,人民币大小写转换(PHP版)
- jdk8Comparator.comparing 排序
- Mina中的Kimchi SNARK
- 手机贴图压缩技术标准及作用
- 逆向工程核心原理 小结
- 关于C语言编译的可执行文件 exe 发给好友解决办法 Visual Studio 2013 版本
- 光环国际20周年庆六城联动峰会「北京场」圆满结束!
- 从零开始学Python爬虫系列:Matplotlib FuncAnimation这1个功能,加1个更新函数,画出最简单的动图,让你爬取的数据动起来。(附:图片上加弹幕功能)
- c 数组上限_深度文章,高手必看:C编程表驱动法编程实践(精华帖,建议收藏并实践)...
热门文章
- android9手机电池管家,电池寿命修复大师手机版
- 圆圈怎么用html实现,如何利用css实现圆形效果?
- 磁共振功能成像BOLD-fMRI原理
- “破局者”氚云——低代码应用搭建工具,基于钉钉敏捷搭建企业专属应用
- 初学者用Eclipse和IDEA哪个好用一点?
- RxJava入门之生命周期管理
- 解决jrebe-JVMTI[FATAL] Couldnt write to C:\Users\启动报错
- 美术绘画之原画场景深入刻画-张聪-专题视频课程
- java项目构建ant_Ant - 项目构建 - 开发工具 - JAVA开源项目 - 开源吧
- 密码学系列 - 椭圆曲线签名的基本原理