opencv 简单、常用的图像处理函数(2)
2.简单常用的图片处理函数
opencv的项目以来配置和环境变量的配置都很简单,对于我这个没有c++基础的来说,复杂的是opencv的api和一些大部分来自国外没有翻译的资料,以及一些常见的编码问题。
资料
opencv安装目录详解
opencv安装完成后并配置好vc++项目后,先不要急着去按照书本上的例子打代码,这里 我们介绍一下opencv的安装目录,目录中有很详尽的功能解决方案,可以让我们在快速学习或项目时可以很方便找到相应功能的大体实现思路,所以了解opencv的安装目录,会加快我们学习的进度和对整体逻辑的理解。
下面简单介绍一下opencv的安装目录,以opencv2.4.13为例
opencv的安装根目录,其中build文件夹为配置项目时的依赖文件,这里在配置时,用处有大体的了解
以上是build文件夹中的文件
doc:生成文档所需的源文件以及辅助脚本
include:opencv引用的源码
java、python:java、python的引用文件
shard:opencv公用的数据文件,xml格式
x64、x86:不通系统下的依赖文件(32、64位操作系统)
以上文件是sources文件夹中的文件,是在opencv中比较有趣和让人兴奋的一部分。
3rdparty:包含第三方的库,比如视频解码用的 ffmpeg,jpg、png、tiff等图片的开源解码库。
apps:包含进行 haar 分类器训练的工具,opencv 进行人脸检测便是基于 haar 分类器。如果你想检测人脸以外的图片,千万不要错过这几个工具。
cmake:包含生成工程项目时 cmake 的依赖文件,用于智能搜索第三方库,普通开发者不需要关心这个文件夹的内容。
data:包含 opencv 库以及范例中用到的资源文件,haar 物体检测的分类器位于haarcascades子文件中。
doc:包含生成文档所需的源文件以及辅助脚本。
include:源码文件夹
modules:核心模块源码
platforms:包含交叉编译所需的工具链以及额外的代码,交叉编译指的是在一个操作系统中编译供另一个系统使用的文件。
samples:这个是我最喜欢的一个文件夹了,里面是代码的示例。
opencv图像处理
1.打开图片
//声明IplImage指针 IplImage * pImg; //判断载入图像是否成功 if(pImg = cvLoadImage("image url",0/1/-1)!=0){ //创建窗口 cvNamedWindow("Image",1); //显示图像 cvShowImage("Image",pImg); //等待按键 cvWaitKey(-1); //销毁窗口 cvDestoryWindow("Image"); //释放图像 cvReleaseImage(&pImg); }
使用函数及参数说明:
cvLoadIamge(fileName,flags); fileName:要被读入的文件的文件名(包括后缀) flags:读入图像的颜色和深度(flags=-1默认图像的原通道;flags=0强制转化为灰度图像;flags=1读取色彩图)
cvNamedWindow(windowName,flags);windowName:表示创建的窗口名称;flags:窗口属性(flags=0用户可以手动更改图像尺寸;flags=1用户不可编辑图像尺寸)
cvWaitKey(delay);函数的功能是不断刷新图像,频率时间为delay,单位为ms。
cvDestroyWindow(windowName);销毁指定名字的窗口。windowName:被销毁的窗体名称
cvReleaseImage(image);释放图像资源
2.拷贝保存图像
//打开图像 IplImage* pImg = createImage(); //根据打开的图像创建图像 IplImage * pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels); //拷贝图像 cvCopy(pImg, pImg2, NULL); //设置该图像保存目录 cvSaveImage("image uri", pImg2); //释放该图片资源 cvReleaseImage(&pImg2);
使用函数及参数说明:
cvCopy:拷贝一个数组给另一个数组。
cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL )
3.图像缩放
//声明两个图片指针 IplImage* src = 0;//源图 IplImage* dst = 0;//新图 float scale = 0.218;//缩放比例 取值0~1 源图比例为1 CvSize dst_cvsize; //新图尺寸 //判断路径图片是否存在 并赋值给src对象 if ((src = cvLoadImage("E:\\tiger.jpg")) != 0){ //根据scale参数设置新图宽高 dst_cvsize.width = src->width * scale; dst_cvsize.height = src->height * scale; //以dst_cvsize 创建图片 并指向新图指针 dst = cvCreateImage(dst_cvsize, src->depth, src->nChannels); //缩放源图至目标图 cvResize(src,dst,CV_INTER_LINEAR); //创建图像窗口 cvNamedWindow("src image window",CV_WINDOW_AUTOSIZE); cvNamedWindow("dst image window", CV_WINDOW_AUTOSIZE); //显示两张图片 cvShowImage("src image window",src); cvShowImage("dst image window", dst); //等待用户响应 cvWaitKey(-1); //释放指针内存 cvReleaseImage(&src); cvReleaseImage(&dst); //销毁所有窗口资源 cvDestroyAllWindows();
使用函数及参数说明:
cvResize:重新调整图像src(或它的ROI),使它精确匹配目标dst(或其ROI)。这里需要说明的是,cvResize可以用来调整3通道图像(如RGB图像)和单通道图像的大小。
cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR )
![](https://images2015.cnblogs.com/blog/530862/201608/530862-20160811153107715-1377945272.png)
alpha混合 透明度
IplImage*src1, *src2; if ((src1 = cvLoadImage("image1 url", 1)) != 0 && (src2 = cvLoadImage("image2 url", 1)) != 0) { int x = 20; int y = 20; int width = 200; int height = 200; double alpha = 0.9; double beta = 0.1; cvSetImageROI(src1, cvRect(x, y, width, height)); cvSetImageROI(src2, cvRect(x, y, width, height)); cvAddWeighted(src1, alpha, src2, beta, 0.0,src1 ); cvResetImageROI(src1); cvNamedWindow("alpha_blend", 1); cvShowImage("alpha_blend", src1); cvWaitKey(); }
使用函数及参数说明:
cvAddWeighted:分割多通道数组成几个单通道数组或者从数组中提取一个通道。
cvAddWeighted( const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst );
alpha //第一个数组元素的权值
src2 //第二个原数组
beta //第二个数组元素的权值
dst //输出数组
gamma //添加的常数项。
函数 cvAddWeighted 计算两数组的加权值的和:
dst(I)=src1(I)*alpha+src2(I)*beta+gamma
所有的数组必须有相同的类型相同的大小(这里是在学习时比较不易懂的地方,我理解其意思是,在操作的两个原数组的属性融合时,其值的和要和单一原数组的属性值相等,否则将会抛出异常)。
代码解读:
1.声明两个图像指针,通过cvLoadImage函数为其指定图片路径,并判断其图片读取合法性。
2.cvSetImageTOI函数标定cvRect函数所指定的坐标大小区域。
3.针对于操作区域进行图像的融合。
4.显示图像。