• OpenCV中Camshitf算法学习


    今天上午,结合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算法过程:

     1 //变量声明
     2 Rect trackWindow;
     3 RotatedRect trackBox;    
     4 int hsize = 16;
     5 int ch[] = {0, 0};
     6 float hranges[] = {0,180};
     7 const float* phranges = hranges;
     8 
     9 Mat image, hsv, hue, mask, hist;//image为摄像头或是用户加载的获得的图片
    10 
    11 cvtColor(image, hsv, CV_BGR2HSV);
    12 inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)),Scalar(180, 256, MAX(_vmin, _vmax)), mask);
    13 hue.create(hsv.size(), hsv.depth());
    14 mixChannels(&hsv, 1, &hue, 1, ch, 1);
    15 calcHist(&hue, 1, 0, mask, hist, 1, &hsize, &phranges);
    16 normalize(hist, hist, 0, 255, CV_MINMAX);
    17 
    18 calcBackProject(&hue, 1, 0, hist, backproj, &phranges);
    19 backproj &= mask;
    20 RotatedRect trackBox = CamShift(backproj, trackWindow,
    21                        TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));

    对于该行代码:

    1 inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)),Scalar(180, 256, 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

  • 相关阅读:
    关于移动端点击后出现闪或者黑色背景
    :after伪类+content内容生成经典应用举例
    移动端(html5)微信公众号下用keyup实时监控input值的变化无效
    jquery-uploadify 上传
    SpringMvc 文件上传
    总结
    poi excel导入
    sencha 安装、学习
    sencha怎么在control层调用按钮
    sencha做个简单的登录界面
  • 原文地址:https://www.cnblogs.com/steven-blog/p/3351834.html
Copyright © 2020-2023  润新知