1
imageTrack->origin = m_Frame->origin;
origin变量可以有两个取值:IPL_ORIGIN_TL或者IPL_ORIGIN_BL,分别代表图像坐标系原点在左上角或是左下角。相应的,在计算机视觉领域,一个重要的错误来源就是原点位置的定义不统一。例如,图像的来源不同,操作系统不同,视频解码codec不同,存储方式不同等等,都可以造成原点位置的变化。例如,你可能认为你正在从图像上面的脸部附近取样,但实际上你却在图像下方的裙子附近取样。最初时,就应该检查一下你的系统中图像的原点位置,这可以通过在图像上方画个形状等方式实现。
http://blog.csdn.net/welcome_xu/article/details/7650680
用选定的图像、图形或物体,对待处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片、滤光片等。数字图像处理中,
掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:①提取感兴趣区,用预先制作
的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。④特殊形状图像的制作。
CVAPI(CvHistogram*) cvCreateHist( int dims, int* sizes, int type,
float** ranges CV_DEFAULT(NULL),
int uniform CV_DEFAULT(1));
//这里ranges表示的是直方图的范围 , 某一维度d , ranges 在uniform下为[0,256] , 且size[d] 为10 ,即将此维分成4份
则[0,64) , [64,128) , [128,192) , [192,256) 包含左边,不包含右边
CV_INLINE void cvCalcHist( IplImage** image, CvHistogram* hist,
int accumulate CV_DEFAULT(0),
const CvArr* mask CV_DEFAULT(NULL) );
image 传入的图像指针,若用cvCreateHist 生成的hist有 dims 个维度, 则传入的图像就得有dims个 ,图像数组 IplImage *image = {h_plane , s_plane} (包含两张图像)
!且图像的大小一样(width ,height)
hist 即一般用cvCreateHist 生成的
accumulate 若为0 ,则在计算此图像的直方图前,将hist先清零 .. 若非0, 则在原来的基础上累加
mask 掩码 , , mask的必须为8位无符号整型 ,单通道图像IplImage 或者CvMat结构 ,将mask看成二值图,非零的地方即为使用(统计)的地方 , 为0时对应的地方不参与运算操作
cvCalcHist 即为统计图像的像素点 ,,
用到的函数:
cvCreateHist
CvHistogram* cvCreateHist( int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );
作用:函数 cvCreateHist 创建一个指定尺寸的直方图,并且返回创建的直方图的指针。如果数组的 ranges 是 0, 则直方块的范围必须由函数 cvSetHistBinRanges 稍后指定。虽然 cvCalcHist 和 cvCalcBackProject 可以处理 8-比特图像而无需设置任何直方块的范围,但它们都被假设等分 0..255 之间的空间。
dims 直方图维数的数目
sizes 直方图维数尺寸的数组
type 直方图的表示格式: CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; CV_HIST_TREE 意味着直方图数据表示为多维稀疏数组 CvSparseMat.
ranges 图中方块范围的数组. 它的内容取决于参数 uniform 的值。这个范围的用处是确定何时计算直方图或决定反向映射(backprojected ),每个方块对应于输入图像的哪个/哪组值。
uniform 归一化标识。 如果不为0,则ranges[i](0<=i<cDims,译者注:cDims为直方图的维数,对于灰度图为1,彩色图为3)是包含两个元素的范围数组,包括直方图第i维的上界和下界。在第i维上的整个区域 [lower,upper]被分割成 dims[i] 个相等的块(译者注:dims[i]表示直方图第i维的块数),这些块用来确定输入象素的第 i 个值(译者注:对于彩色图像,i确定R, G,或者B)的对应的块;如果为0,则ranges[i]是包含dims[i]+1个元素的范围数组,包括lower0, upper0, lower1, upper1 == lower2, ..., upperdims[i]-1, 其中lowerj 和upperj分别是直方图第i维上第 j 个方块的上下界(针对输入象素的第 i 个值)。任何情况下,输入值如果超出了一个直方块所指定的范围外,都不会被 cvCalcHist 计数,而且会被函数 cvCalcBackProject 置零。
cvCalcHist
void cvCalcHist( IplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL );
作用:函数 cvCalcHist 计算一张或多张单通道图像的直方图(译者注:若要计算多通道,可像以下例子那样用多个单通道图来表示)。用来增加直方块的数组元素可从相应输入图像的同样位置提取。 Sample. 计算和显示彩色图像的 2D 色调-饱和度图像
image 输入图像s (虽然也可以使用 CvMat** ).
hist 直方图指针
accumulate 累计标识。如果设置,则直方图在开始时不被清零。这个特征保证可以为多个图像计算一个单独的直方图,或者在线更新直方图。
mask 操作 mask, 确定输入图像的哪个象素被计数
cvGetMinMaxHistValue
void cvGetMinMaxHistValue( const CvHistogram* hist,
float* min_value, float* max_value,
int* min_idx=NULL, int* max_idx=NULL );
作用:函数 cvGetMinMaxHistValue 发现最大和最小直方块以及它们的位置。任何输出变量都是可选的。在具有同样值几个极值中,返回具有最小下标索引(以字母排列顺序定)的那一个
hist 直方图
min_value 直方图最小值的指针
max_value 直方图最大值的指针
min_idx 数组中最小坐标的指针
max_idx 数组中最大坐标的指针
cvConvertScale
使用线性变换转换数组
void cvConvertScale( const CvArr* src, CvArr* dst, double scale=1,
double shift=0 );
#define cvCvtScale cvConvertScale
#define cvScale cvConvertScale
#define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0
)
src
输入数组.
dst 输出数组
scale
比例因子.
shift
该加数被加到输入数组元素按比例缩放后得到的元素上
函数 cvConvertScale
有多个不同的目的因此就有多个同义函数(如上面的#define所示)。该函数首先对输入数组的元素进行比例缩放,然后将shift加到比例缩放后得到的各元素上,即:
dst(I)=src(I)*scale + (shift,shift,...),最后可选的类型转换将结果拷贝到输出数组。
多通道的数组对各个通道是独立处理的。
类型转换主要用舍入和溢出截断来完成。也就是如果缩放+转换后的结果值不能用输出数组元素类型值精确表达,就设置成在输出数组数据轴上最接近该数的值。
如果 scale=1,
shift=0 就不会进行比例缩放. 这是一个特殊的优化,相当于该函数的同义函数名:cvConvert
。如果原来数组和输出数组的类型相同,这是另一种特殊情形,可以被用于比例缩放和平移矩阵或图像,此时相当于该函数的同义函数名:cvScale。
代码:
// 019 单通道图像的直方图.cpp : Defines the entry point for the console
application.
//
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <ctype.h>
int main( int argc, char** argv )
{
IplImage
*src = 0;
IplImage
*histimg = 0;
CvHistogram
*hist =
0;
//直方图
// int hdims =
50;
// 划分HIST的个数,越高越精确
// int hdims=100;
int hdims=255;
float hranges_arr[] = {0,255};
float*
hranges = hranges_arr;
int
bin_w;
float
max_val;
int i;
src=cvLoadImage("Lena.jpg",0); //灰度读入
cvNamedWindow( "Histogram", 0 );
cvNamedWindow( "src", 0);
hist =
cvCreateHist( 1, &hdims, CV_HIST_ARRAY,
&hranges, 1 );
//创建直方图
histimg =
cvCreateImage( cvSize(320,200), 8, 3 );
cvZero(
histimg
);
//清零
cvCalcHist( &src, hist, 0, 0
);
// 计算直方图,即每个bin的大小
cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0
);
// 只找最大值
cvConvertScale(
hist->bins,
hist->bins,
max_val ? 255. / max_val : 0., 0
);
// 缩放 bin 到区间 [0,255]
cvZero(
histimg );
bin_w =
histimg->width /
hdims;
// hdims: 直方图竖条的个数,则 bin_w 为条的宽度
//
画直方图
for( i = 0;
i < hdims; i++ )
{
double val = (
cvGetReal1D(hist->bins,i)*histimg->height/255
);
CvScalar color =
CV_RGB(255,255,0);
//(hsv2rgb(i*180.f/hdims);
cvRectangle( histimg,
cvPoint(i*bin_w,histimg->height),
cvPoint((i+1)*bin_w,(int)(histimg->height -
val)),
color, 1, 8, 0 );
}
cvShowImage(
"src", src);
cvShowImage(
"Histogram", histimg );
cvWaitKey(0);
cvDestroyWindow("src");
cvDestroyWindow("Histogram");
cvReleaseImage( &src );
cvReleaseImage( &histimg );
cvReleaseHist ( &hist );
return
0;
}
转载自博客http://blog.sina.com.cn/s/blog_a98e39a201011vey.html
函数原型:double cvGetReal1D(const CvArr* arr, int idx0)
参数:
arr:单通道的图像
idx0:像素在图像中的位置
返回值:idx0对应的像素值

浙公网安备 33010602011771号