函数原型
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
各个参数的意义比较直观,但是需要注意的是dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0;resize函数的目标大小可以是任意的大小,可以不保持长宽比率,删除的像素或者新增的像素值通过interpolation(内插)控制;
update:fx,fy分别指水平和垂直方向的比率;如果dsize 为零,则目标图像的大小是通过这两个参数来计算的:目标图像的宽度为原图像的宽度*fx,同理目标图像的高度为原图像的高度*fy;
如果dsize不为零,fx,fy会自动计算:fx=dsize.width/src.cols;fy=dsize.height/src.rows;
因此dsize和(fx,fy)只需设置其中一个,另外一个置为零就可以了~~
2.namedWindow函数
顾名思义,namedWindow函数,用于创建一个窗口。函数原型是这样的:
第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。
第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:
WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
函数剖析:
首先需要注意的是,它有默认值WINDOW_AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。
namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。
我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。
但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。
3.滤波
滤波例子较全
以前的时候,为了过滤图像中的一些噪点,学过一些简单的滤波,比如中值滤波,均值滤波,也是自己实现的。
在opencv中有现成的函数可以调用,实现滤波的操作。
函数的原型如下:
CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst, int smoothtype CV_DEFAULT(CV_GAUSSIAN), int size1 CV_DEFAULT(3), int size2 CV_DEFAULT(0), double sigma1 CV_DEFAULT(0), double sigma2 CV_DEFAULT(0));
前两个参数是输出图像的指针,目标图像的指针;
第三个参数是传入一个值,表示现在滤波的方式;
最后四个值一般用来表示模板的大小
平滑类型 | 名称 | 支持 | 输入数据类型 | 输出数据类型 | 简要说明 | |
CV_BLUR |
简单模糊 | 对每个像素点做size1*size2模板的求和sum,在ret=sum/(size1*size2) | ||||
CV_BLUR_NO_SCALE |
简单无缩放变化的模糊 | 对每个像素点做size1*size2模板的求和sum,ret=sum | ||||
CV_MEDIAN | 中值模糊 | 对图像进行size1*size2模板的取中位数,ret=中位数 | ||||
CV_GAUSSIAN | 高斯模糊 | 是一种加权平均的过程,若使用3×3模板,则计算公式如下g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16; | ||||
CV_BILATERAL | 双边滤波 |
实例代码:
#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/lv2.jpg");//读取图片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1显示图片 // cvCopy(img,temp); IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图 cvGetSize(img), IPL_DEPTH_8U, ); cvSmooth(img,temp,CV_BLUR,3,3);//简单模糊 cvShowImage("Example2",temp); cvSmooth(img,temp,CV_BLUR_NO_SCALE,3,3);//简单无缩放变化的模糊 cvShowImage("Example3",temp); cvSmooth(img,temp,CV_MEDIAN,3,3);//中值模糊 cvShowImage("Example4",temp); cvSmooth(img,temp,CV_GAUSSIAN,3,3);//高斯模糊 cvShowImage("Example5",temp); cvSmooth(img,temp,CV_BILATERAL,1,150,240,480);//双边滤波 cvShowImage("Example6",temp); cvWaitKey(0);//暂停用于显示图片 cvReleaseImage(&img);//释放img所指向的内存空间并且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); cvDestroyWindow("Example4"); cvDestroyWindow("Example5"); cvDestroyWindow("Example6"); return 0; }