今天上午,结合OpenCV自带的camshitf例程,简单的对camshitf有了一个大致的认识和理解,现总结如下:

1:关于HSV

H指hue(色相)、S指saturation(饱和度)、V指value(色调)。

  • 色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等;
  • 饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值;
  • 明度(V)取0-100%。

RGB 和 CMYK 分别是加法原色和减法原色模型,以原色组合的方式定义颜色,而 HSV 以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。

更多内容可参考:维基百科

2:关于Camshift算法的实现过程

Camshift的过程主要包含了3个部分:

  • Back Projection(反投影)

Camshift的原理是根据关注区域的颜色(hue)的直方图来进行跟踪,所以Back Projection的过程从结果上来将就是得到hue的直方图,或者是颜色的概率分布的。什么叫做Back Projection? Back Projection 就是将hue直方图转换成hue(色彩)概率分布图。具体的步骤分为:
1):将原始RGB图像转换颜色空间到HSV色彩空间上
2):将hsv中的h分量提取出来的
3):计算出指定区域的hue直方图——直方图代表了不同H分量取值出现的概率,或者说可以据此查找出H分量的大小为x时的概率或像素个数,即,得到颜色概率查找表

4):Back Projection过程——将图像中每个像素的值用其颜色出现的概率进行替换,由此得到颜色概率分布图

  • MeanShift

1):设置初始化窗口
2):计算这个窗口的重心(xc,yc)
3):将窗口的中心移到重心上面去。(中心就是窗口的矩形两个对角线 的交叉点)
4):重复上面的2和3的步骤,知道最后窗口的位置不再变换为止.

  • Camshift

对于Camshift(Continuously Adaptive Mean-Shift)的基本原理是对视频图像的所有帧作MeanShift运行,并将上一帧的结果作为下一帧的初始化初始化窗口,如此迭代就可以进行跟踪了。

3:代码

结合OpenCV自带的camshitf例程,用代码实现camshitf算法过程:

 //变量声明
Rect trackWindow;
RotatedRect trackBox;
int hsize = ;
int ch[] = {, };
float hranges[] = {,};
const float* phranges = hranges; Mat image, hsv, hue, mask, hist;//image为摄像头或是用户加载的获得的图片 cvtColor(image, hsv, CV_BGR2HSV);
inRange(hsv, Scalar(, smin, MIN(_vmin,_vmax)),Scalar(, , MAX(_vmin, _vmax)), mask);
hue.create(hsv.size(), hsv.depth());
mixChannels(&hsv, , &hue, , ch, );
calcHist(&hue, , , mask, hist, , &hsize, &phranges);
normalize(hist, hist, , , CV_MINMAX); calcBackProject(&hue, , , hist, backproj, &phranges);
backproj &= mask;
RotatedRect trackBox = CamShift(backproj, trackWindow,
TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, , ));

对于该行代码:

 inRange(hsv, Scalar(, smin, MIN(_vmin,_vmax)),Scalar(, , MAX(_vmin, _vmax)), mask);

inRange函数的功能是检查输入数组每个元素大小是否在2个给定数值之间,可以有多通道,mask保存0通道的最小值,也就是h分量;这里利用了hsv的3个通道,比较h,0~180,s,smin~256,v,min(_vmin,_vmax),max(_vmin,_vmax)。如果3个通道都在对应的范围内,则mask对应的那个点的值全为1(0xff),否则为0(0x00).

参考资料:

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

Opencv Camshift学习总结

camShift跟踪算法介绍

StevenMeng

2013.10.04

OpenCV中Camshitf算法学习的更多相关文章

  1. OpenCV中Camshitf算法学习(补充)

    结合OpenCV中Camshitf算法学习,做一些简单的补充,包括: 实现全自动跟随的一种方法 参考opencv中的相关demo,可以截取目标物体的图片,由此预先计算出其色彩投影图,用于实际的目标跟随 ...

  2. 5. openCV中常用函数学习

    一.前言 经过两个星期的努力,一边学习,一边写代码,初步完成了毕业论文系统的界面和一些基本功能,主要包括:1 数据的读写和显示,及相关的基本操作(放大.缩小和移动):2 样本数据的选择:3 数据归一化 ...

  3. OPENCV下SIFT算法使用方法笔记

    这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操 ...

  4. OpenCV学习(22) opencv中使用kmeans算法

    kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html 下面学习一下opencv中kmeans函数的使用.      首先我们 ...

  5. 深入学习OpenCV中图像灰度化原理,图像相似度的算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

  6. 【转】PCA算法学习_1(OpenCV中PCA实现人脸降维)

    前言: PCA是大家经常用来减少数据集的维数,同时保留数据集中对方差贡献最大的特征来达到简化数据集的目的.本文通过使用PCA来提取人脸中的特征脸这个例子,来熟悉下在oepncv中怎样使用PCA这个类. ...

  7. OpenCV学习(39) OpenCV中的LBP图像

    本章我们学习LBP图像的原理和使用,因为接下来教程我们要使用LBP图像的直方图来进行脸部识别. 参考资料: http://docs.opencv.org/modules/contrib/doc/fac ...

  8. OpenCV中的SURF算法介绍

    SURF:speed up robust feature,翻译为快速鲁棒特征.首先就其中涉及到的特征点和描述符做一些简单的介绍: 特征点和描述符 特征点分为两类:狭义特征点和广义特征点.狭义特征点的位 ...

  9. opencv算法学习

    1.改变图像的亮度和对比度: 算法介绍:对每一点像素值的r,g,b,值进行乘法和加法的运算. 代码使用: ; y < image.rows; y++ ) { ; x < image.col ...

随机推荐

  1. 【java】JDK1.8时间日期库 新特性 所有java中时间Date的使用

    除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用java 8的这套API.Java对日期, ...

  2. easyui datagrid加载成功之后选定并获取首行数据

    //加载成功之后,选定并获取首行数据 onLoadSuccess:function(data){ alert("grid加载成功"); var rows=$('test').dat ...

  3. Qt 之 模仿 QQ登陆界面——样式篇

    一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...

  4. Laravel系列教程一:安装及环境配置

    免费视频教程地址https://laravist.com/series/laravel-5-basic 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算 ...

  5. [转载] 在Linux中,开机自动运行普通用户的脚本程序

    FROM:http://blog.csdn.net/sinboy/article/details/2466225 FROM:http://www.2cto.com/os/201006/50680.ht ...

  6. Appium Python 一:环境搭建

    安装Android SDK以及模拟器 由于Appium依赖于Android SDK,所以需要先安装SDK. 这里由于需要在Android模拟器上跑测试用例,所以同时需要安装Android 模拟器. 1 ...

  7. antd-design LocaleProvider国际化

    1.LocaleProvider 使用 React 的 context 特性,只需在应用外围包裹一次即可全局生效. import { LocaleProvider } from 'antd'; imp ...

  8. iOS 计步器的几种实现方式

    代码地址如下:http://www.demodashi.com/demo/11658.html 这篇文章介绍两种可以获取计步数据的方法,一种是采用CMPedometer获取手机计步器数据,另一种是采用 ...

  9. YII用户注冊和用户登录(五)之进行session和cookie分析 ,并在前后区分session和cookie

    5 进行session和cookie分析 ,并在前后区分session和cookie: 记住登录状态 这样下次再登录站点的时候.就不用反复输入username和password. 是浏览器的cooki ...

  10. WebLogic92数据源配置

    一. 将数据库连接所需的包导入(非常重要) 最简单的方法就是,将所需jar包复制至%MYDOMAIN_HOME%/lib中,约定本应用域的名称为“ MyDomain”,根路径为%MYDOMAIN_HO ...