openCV——几个实用函数2010年12月20日星期一 09:181. cvSmooth:各种方法的图像平滑void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3, int param2=0, double param3=0 );src输入图像.dst输出图像.smoothtype平滑方法:. CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。
如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。
. CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2).. CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为param1×param2 的高斯卷积. CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的).. CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色sigma=param1,空间 sigma=param2. 平滑操作的第一个参数.param2平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。
param3对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2 对应垂直核.对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。
如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作).函数 cvSmooth 可使用上面任何一种方法平滑图像。
每一种方法都有自己的特点以及局限。
没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。
简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。
这两种方法可以(in-place)方式处理图像。
中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.2.IplImage结构由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。
IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。
IplImage结构具体定义如下:typedef struct _IplImage{int nSize; /* IplImage大小 */int ID; /* 版本 (=0)*/int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道*/int alphaChannel; /* 被OpenCV忽略 */int depth; /* 像素的位深度,主要有以下支持格式:IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S,IPL_DEPTH_32F 和IPL_DEPTH_64F */char colorModel[4]; /* 被OpenCV忽略 */char channelSeq[4]; /* 同上 */int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.只有cvCreateImage可以创建交叉存取图像 */int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构*/int align; /* 图像行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 */int width; /* 图像宽像素数 */int height; /* 图像高像素数*/struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时,只对该区域进行处理 */struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */ void *imageId; /* 同上*/struct _IplTileInfo *tileInfo; /*同上*/int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/char *imageData; /* 指向排列的图像数据 */int widthStep; /* 排列的图像行大小,以字节为单位 */int BorderMode[4]; /* 边际结束模式, 在 OpenCV 被忽略*/int BorderConst[4]; /* 同上 */char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */} IplImage;IplImage结构体是整个OpenCV函数库的基础,在定义该结构变量时需要用到函数cvCreatImage,变量定义方法如下:IplImage* src="/cvCreateImage"(cvSize(400,300),IPL_DEPTH_8U,3);上句定义了一个IplImage指针变量src,图像的大小是400×300,图像颜色深度8位,3通道图像。
3.常用的五个函数(I/O)1). 图像载入函数函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage 指针。
函数支持bmp、jpg、 png、 tiff等格式的图像。
其函数原型如下:IplImage* cvLoadImage( const char* filename, int iscolor);其中,filename 是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。
2). 窗口定义函数函数cvNamedWindow定义一个窗口,用于显示图像。
其函数原型如下:int cvNamedWindow( const char* name, unsigned long flags );其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。
CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。
3). 图像显示函数函数cvShowImage是在指定的窗口中显示图像,其函数原型如下:void cvShowImage( const char* name, const CvArr* image );其中,name是窗口名称,image是图像类型指针,一般是IplImage指针。
4). 图像保存函数函数cvSaveImage以指定的文件名保存IplImage类型的指针变量,其函数原型如下:int cvSaveImage( const char* filename, const CvArr* image );其中,filename是图像保存路径和名称,image是IplImage指针变量。
5). 图像销毁函数函数cvReleaseImage销毁已定义的IplImage指针变量,释放占用内存空间。
其函数原型如下:void cvReleaseImage( IplImage** image );其中,image为已定义的IplImage指针。
4.cvCreatImagecvCreateImage:创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, intchannels );参数说明:size 图像宽、高.depth 图像元素的位深度,可以是下面的其中之一:IPL_DEPTH_8U - 无符号8位整型IPL_DEPTH_8S - 有符号8位整型IPL_DEPTH_16U - 无符号16位整型IPL_DEPTH_16S - 有符号16位整型IPL_DEPTH_32S - 有符号32位整型IPL_DEPTH_32F - 单精度浮点数IPL_DEPTH_64F - 双精度浮点数channels:每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式:header = cvCreateImageHeader(size,depth,channels);cvCreateData(header);5.cvLoadImageIplImage* cvLoadImage( const char* filename, intflags=CV_LOAD_IMAGE_COLOR );filename要被读入的文件的文件名(包括后缀)。
flags指定读入图像的颜色和深度:指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR), 单信道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。
深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。
选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。
如果输入有冲突的标志,将采用较小的数字值。
比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3信道图。