/*
Computes a reference histogram for each of the object regions defined by
the user
@param frame video frame in which to compute histograms; should have been
converted to hsv using bgr2hsv in observation.h
@param regions regions of \a frame over which histograms should be computed
@param n number of regions in \a regions
@param export if TRUE, object region images are exported
@return Returns an \a n element array of normalized histograms corresponding
to regions of \a frame specified in \a regions.
*/
histogram** compute_ref_histos( IplImage* frame, CvRect* regions, int n )
{
histogram** histos = malloc( n * sizeof( histogram* ) );
IplImage* tmp;
int i;
/* extract each region from frame and compute its histogram */
for( i = 0; i < n; i++ )
{
cvSetImageROI( frame, regions[i] );//set the region of interest
tmp = cvCreateImage( cvGetSize( frame ), IPL_DEPTH_32F, 3 );
cvCopy( frame, tmp, NULL );
cvResetImageROI( frame );//free the ROI
histos[i] = calc_histogram( &tmp, 1 );//calculate the hisrogram
normalize_histogram( histos[i] );//Normalizes a histogram so all bins sum to 1.0
cvReleaseImage( &tmp );
}
return histos;
}
程
序中先设置了一个类型为histogram的指向指针的指针,是histogram指针数组的指针,这个数组是多个选定区域的直方图数据存放的位置。然后
对于每一个用户指定的区域,在第一帧中都进行了ROI区域设置,通过对ROI区域的设置取出选定区域,交给函数calc_histogram计算出直方
图,并使用normalize_histogram对直方图进行归一化。
计算直方图的函数详解如下:
/*
Calculates a cumulative histogram as defined above for a given array
of images
@param img an array of images over which to compute a cumulative histogram;
each must have been converted to HSV colorspace using bgr2hsv()
@param n the number of images in imgs
@return Returns an un-normalized HSV histogram for \a imgs
*/
histogram* calc_histogram( IplImage** imgs, int n )
{
IplImage* img;
histogram* histo;
IplImage* h, * s, * v;
float* hist;
int i, r, c, bin;
histo = malloc( sizeof(histogram) );
histo->n = NH*NS + NV;
hist = histo->histo;
memset( hist, 0, histo->n * sizeof(float) );
for( i = 0; i < n; i++ )
{
/* extract individual HSV planes from image */
img = imgs[i];
h = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );
s = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );
v = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );
cvCvtPixToPlane( img, h, s, v, NULL );
/* increment appropriate histogram bin for each pixel */
for( r = 0; r < img->height; r++ )
for( c = 0; c < img->width; c++ )
{
bin = histo_bin( pixval32f( h, r, c ),
pixval32f( s, r, c ),
pixval32f( v, r, c ) );
hist[bin] += 1;
}
cvReleaseImage( &h );
cvReleaseImage( &s );
cvReleaseImage( &v );
}
return histo;
}
这个函数将h、s、 v分别取出,然后以从上到下,从左到右的方式遍历以函数histo_bin的评判规则放入相应的bin中(很形象的)。函数histo_bin的评判规则详见下图:
|----|----|----|。。。。|----|------|------|。。。。|-------|
1NH 2NH 3NH NS*NH NS*NH+1 NS*NH+2 NS*NH+NV
分享到:
相关推荐
基于opencv的图像粒子滤波算法,程序中包含图像直方图的计算和camshift的目标跟踪算法。
建立在opencv上的粒子滤波目标跟踪,实现的效果还不错,大家有空可以看下,有什么不足就指出,修改下。
粒子滤波广泛的应用于目标跟踪,粒子滤波器是一种序列蒙特卡罗滤波方法,其实质是利用一系列随机抽取的样本(即粒子)来替代状态的后验概率分布。在此不打算介绍和推理繁杂的概率公式,我们来分析Rob Hess源码从而...
OPENCV目标跟踪_opencv_目标检测_卡尔曼滤波算法_opencv代码_鼠标跟踪_VC++.zip
卡尔曼滤波算法,opencv代码,鼠标跟踪 卡尔曼滤波算法,opencv代码,鼠标跟踪 卡尔曼滤波算法,opencv代码,鼠标跟踪 卡尔曼滤波算法,opencv代码,鼠标跟踪 卡尔曼滤波算法,opencv代码,鼠标跟踪
在vc++平台上利用opencv编写的基于人体肤色的跟踪程序,可实现对人体肤色部位的跟踪。
用opencv和粒子滤波实现的跟踪程序,在VC平台上实现。在运行之前一定要安装 opencv
这个粒子滤波算法的工程文件,解压压缩包即可运行。本文的开发环境为VS2010+OpenCV2.2。
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法方框滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法中值滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法双边滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法引导滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法高斯滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法积分图快速均值滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法常规均值滤波
opencv opencv_基于c++实现的opencv图像处理算法之图像滤波算法彩色引导滤波
在OPENCV环境下实现目标的跟踪,采用粒子滤波的方法
OPENCV目标跟踪卡尔曼滤波算法,opencv代码,鼠标跟踪 提取方式是百度网盘分享地址
卡尔曼滤波算法,opencv代码,鼠标跟踪.zip资源matlab opencv运动目标检测程序资料卡尔曼滤波算法,opencv代码,鼠标跟踪.zip资源matlab opencv运动目标检测程序资料卡尔曼滤波算法,opencv代码,鼠标跟踪.zip资源...
opencv直方图滤波的实现,利用了calcHist,calcBackproject。