• CvCamShift算法+原理(转)


    一. Back Projection计算

    CamShift算法,即”Continuously Apative Mean-Shift”算法,是一种运动跟踪算法。它主要通过视频图像中运动物体的颜色信息来达到跟踪的目的。我把这个算法分解成三个部分,便于理解:
    1) Back Projection计算
    2) Mean Shift算法
    3) CamShift算法
    在这里主要讨论Back Projection,在随后的文章中继续讨论后面两个算法。

    Back Projection
    计算Back Projection的步骤是这样的:
    1. 计算被跟踪目标的色彩直方图。在各种色彩空间中,只有HSI空间(或与HSI类似的色彩空间)中的H分量可以表示颜色信息。所以在具体的计算过程中,首先将其他的色彩空间的值转化到HSI空间,然后会其中的H分量做1D直方图计算。
    2. 根据获得的色彩直方图将原始图像转化成色彩概率分布图像,这个过程就被称作”Back Projection”。
    在OpenCV中的直方图函数中,包含Back Projection的函数,函数原型是:
       void cvCalcBackProject(IplImage** img, CvArr** backproject, const CvHistogram* hist);
    传递给这个函数的参数有三个:
    1. IplImage** img:存放原始图像,输入。
    2. CvArr** backproject:存放Back Projection结果,输出。
    3. CvHistogram* hist:存放直方图,输入

    下面就给出计算Back Projection的OpenCV代码。
    1.准备一张只包含被跟踪目标的图片,将色彩空间转化到HSV空间,获得其中的H分量:
    IplImage* target=cvLoadImage(”target.bmp”,-1); //装载图片
    IplImage* target_hsv=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
    IplImage* target_hue=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );
    cvCvtColor(target,target_hsv,CV_BGR2HSV);       //转化到HSV空间
    cvSplit( target_hsv, target_hue, NULL, NULL, NULL );    //获得H分量
    2.计算H分量的直方图,即1D直方图:
    IplImage* h_plane=cvCreateImage( cvGetSize(target_hsv),IPL_DEPTH_8U,1 );
    int hist_size[]={255};          //将H分量的值量化到[0,255]
    float* ranges[]={ {0,360} };    //H分量的取值范围是[0,360)
    CvHistogram* hist=cvCreateHist(1, hist_size, ranges, 1);
    cvCalcHist(&target_hue, hist, 0, NULL);
    在这里需要考虑H分量的取值范围的问题,H分量的取值范围是[0,360),这个取值范围的值不能用一个byte来表示,为了能用一个byte表示,需要将H值做适当的量化处理,在这里我们将H分量的范围量化到[0,255].
    4.计算Back Projection:
    IplImage* rawImage;
    //———————————————-
    //get from video frame,unsigned byte,one channel
    //———————————————-
    IplImage* result=cvCreateImage(cvGetSize(rawImage),IPL_DEPTH_8U,1);
    cvCalcBackProject(&rawImage,result,hist);
    5.结果:result即为我们需要的

    二、MeanShift

    在反向投影图中发现目标中心。

    int cvMeanShift( const CvArr* prob_image, CvRect window,
                     CvTermCriteria criteria, CvConnectedComp* comp );

    prob_image
    目标直方图的反向投影(见 cvCalcBackProject).
    window
    初始搜索窗口
    criteria
    确定窗口搜索停止的准则
    comp
    生成的结构,包含收敛的搜索窗口坐标 (comp->rect 字段) 与窗口内部所有象素点的和 (comp->area 字段).

    函数 cvMeanShift 在给定反向投影和初始搜索窗口位置的情况下,用迭代方法寻找目标中心。当搜索窗口中心的移动小于某个给定值时或者函数已经达到最大迭代次数时停止迭代。 函数返回迭代次数。

    三、CamShift

    发现目标中心,尺寸和方向

    int cvCamShift( const CvArr* prob_image, CvRect window, CvTermCriteria criteria,
                    CvConnectedComp* comp, CvBox2D* box=NULL );

    prob_image
    目标直方图的反向投影 (见 cvCalcBackProject).
    window
    初始搜索窗口
    criteria
    确定窗口搜索停止的准则
    comp
    生成的结构,包含收敛的搜索窗口坐标 (comp->rect 字段) 与窗口内部所有象素点的和 (comp->area 字段).
    box
    目标的带边界盒子。如果非 NULL, 则包含目标的尺寸和方向。

    函数 cvCamShift 实现了 CAMSHIFT 目标跟踪算法([Bradski98]). 首先它调用函数 cvMeanShift 寻找目标中心,然后计算目标尺寸和方向。最后返回函数 cvMeanShift 中的迭代次数。

    CvCamShiftTracker 类在 cv.hpp 中被声明,函数实现了彩色目标的跟踪。

  • 相关阅读:
    RxJS 系列 – Error Handling Operators
    RxJS 系列 – Join Creation Operators
    Google – Reviews
    Google Analytics – GA4 & Tag Manager 概念篇
    DOM & BOM – Input File, Drag & Drop File, File Reader, Blob, ArrayBuffer, File, UTF8 Encode/Decode, Download File
    RxJS 系列 – 大杂烩
    RxJS 系列 – Join Operators
    RxJS 系列 – 实战练习
    前端接收文件流并下载解决乱码问题
    package.json 与 packagelock.json 的关系
  • 原文地址:https://www.cnblogs.com/aicro/p/1950749.html
Copyright © 2020-2023  润新知