这里对opencv里面的一些比较常见的函数做了一个归纳,有C接口的,也有C++接口的;更多函数可以查询最新的OpenCV文档
1.cvNormalize
功能:根据某种范数或者数值范围归一化数组.
void cvNormalize( const CvArr* src, CvArr* dst, double a=1, double b=0, int norm_type=CV_L2,const CvArr* mask=NULL );
src: 输入数组
dst: 输出数组,支持原地运算
a: 输出数组的最小/最大值或者输出数组的范数
b:输出数组的最大/最小值
norm_type: 归一化的类型
可以有以下的取值:
CV_C - 归一化数组的C-范数(绝对值的最大值)
CV_L1 - 归一化数组的L1-范数(绝对值的和)
CV_L2 - 归一化数组的(欧几里德)L2-范数
CV_MINMAX - 数组的数值被平移或缩放到一个指定的范围
mask 操作掩膜,用于指示函数是否仅仅对指定的元素进行操作
该函数归一化输入数组使它的范数或者数值范围在一定的范围内
对于不同的norm_type, 根据(mask=null)的时候, a,b(a>b)起的作用结果如下:
norm_type=CV_C时, src 被重新"缩放"(rescale)到dst, 使得dst的值是线性映射到[0,1]区间.(a,b其实无作用)
norm_type=CV_L1,或者 CV_L2时, 得到L1,L2规范化的dst.(a,b其实无作用)
norm_type=CV_MINMAX时, src会被缩放(rescale)和移动(translation)到dst,使得dst的值是线性映射到[b,a]区间.
2.cvConvert
因为 IplImage 里的数据,你只能用uchar的形式存放,当你需要这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;
然而CvMat里却可以存放任意通道数、任意格式的数据,这个机制方便了研究中的这种需求,转化为矩阵就可以进行更自由的计算;
1 void Show(CvMat* mat) 2 { 3 CvSize size = cvSize(mat->width,mat->height); 4 IplImage* imgBuf = cvCreateImage(size,IPL_DEPTH_8U,1); 5 cvConvert(mat,imgBuf); 6 cvNamedWindow("mat",CV_WINDOW_AUTOSIZE); 7 cvShowImage("image",mat); 8 cvWaitKey(0); 9 cvReleaseImage(&imgBuf); 10 }
3.cvCopy
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。cvCopy会把src中的数据复制到dst的内存中。
4.cvCloneImage
IplImage* cvCloneImage( const IplImage* image );
在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好image里面的数据,然后把这段内存中的数据返回给你。
5.cvFilter2D
对图像做卷积
void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1));
- src 输入图像.
- dst 输出图像.
- kernel 卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用cvSplit函数分解图像到单个色彩通道上,然后单独处理。
- anchor 核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
- 本函数对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素差值得到边界外面的象素值。