OPENCV学习经过
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OPENCV学习经过
因为工程实践的原因,我们初步了解了VS2010和OPENCV2.4.10,为以后车牌识别系统的开发打下基础。首先是开发平台的搭建,我们通过上网了解了配置过程:
1.配置环境变量,我的电脑>>属性>>高级>>环境变量
编辑PATH:
“opencv的安装目录\opencv\build\x86\vc10\bin”
和“opencv的安装目录\opencv\build\x64\vc10\bin
2.(1)工程包含目录配置
打开vs2010,新建一个win32控制台应用程序,空项目,取名为test
在配置属性--->VC++目录--->包含目录文件中添加D:\opencv\build\include\opencv2
D:\opencv\build\include\opencv1 D:\opencv\build\include(根据自己OPENCV文件
安装的路径来写)
(2)工程库目录配置
在配置属性--->VC++目录--->库目录中添加D:\opencv\build\x64\vc10\lib(根据自己
OPENCV文件安装的路径来写)
(3)链接库配置
打开属性页面。【通用属性】->【链接器】->【输入】->【附加的依赖项】,添加如下内容:
opencv_ml2410d.lib
opencv_calib3d2410d.lib
opencv_contrib2410d.lib
opencv_core2410d.lib
opencv_features2d2410d.lib
opencv_flann2410d.lib
opencv_gpu2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_legacy2410d.lib
opencv_objdetect2410d.lib
opencv_ts2410d.lib
opencv_video2410d.lib
opencv_nonfree2410d.lib
opencv_ocl2410d.lib
opencv_photo2410d.lib
opencv_stitching2410d.lib
opencv_superres2410d.lib
opencv_videostab2410d.lib
opencv_objdetect2410.lib
opencv_ts2410.lib
opencv_video2410.lib
opencv_nonfree2410.lib
opencv_ocl2410.lib
opencv_photo2410.lib
opencv_stitching2410.lib
opencv_superres2410.lib
opencv_videostab2410.lib
opencv_calib3d2410.lib
opencv_contrib2410.lib
opencv_core2410.lib
opencv_features2d2410.lib
opencv_flann2410.lib
opencv_gpu2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
opencv_legacy2410.lib
opencv_ml2410.lib
(4)测试配置结果:
在解决方案资源管理器中右键点击源文件>>添加>>新建项>>C++文件,名为test.cpp
输入以下代码:
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("pp.jpg");
if(img.empty())
{
cout<<"error";
return -1;
}
imshow("xx的靓照",img);
waitKey();
return 0;
}
我们平常一般使用64位操作系统;因此要把解决方案平台从win32改为x64。修改后生成解决方案,但仍出现如下错误:
经过上网查资料,需要在项目属性>>链接器>>目标计算机成x64的选项:(操作完成后需要重启计算机)
生成解决方案后,在DEBUG文档中放入名为“pp.jpg”的图片。
双击生成的test.exe文件
总结:要注意解决平台与计算机系统的匹配。
学习一:图像的载入,显示和输出
最简单的图像载入和显示只需要3句代码,非常便捷。这三句代码分别对应了三个函数,他们分别是:
imread( ), namedWindow( )以及imshow( )。
1. Inmread 用于读取图片,Imread的官方定义:Mat imread(const string& filename , int flags=1) (注意:flag>0
返回一个3通道的彩色图像。Flags<0返回包含Alpha通道的加载的图像,flags=0返回灰度图像)
2. nameWindow用于创建一个窗口,nameWindow的官方定义:void namedWindow(const string& winname,int
flags=WINDOW_AUTOSIZE );
3. imshow用于在指定的窗口中显示一幅图像,imshow官方定义:void imshow(const string& winname,
InputArray mat);
输出图像到文件——imwrite函数
定义:bool imwrite(const string& filename,InputArray img, const vector
最后将上述所学编一个综合实例:
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat boyss=imread("boy.jpg",1);
if (boyss.empty())
{
return -1;
}
namedWindow("boys");
imshow("boys",boyss);
imwrite("帅气",boyss);
waitKey();
return 0;
}
生成test1.exe,效果图如下:
学习二:ROI区域图像叠加
在图像处理领域,我们常常需要设置感兴趣区域(ROI,region of interest),来专注或者简化我们的工作过程。也就是从图像中选择的一个图像区域,这个区域是我们图像分析所关注的重点。我们圈定这个区域,以便进行进一步处理。定义方法:
Mat imageROI;
ImageROI=image(Rect(500,250,log.cols,log.rows));
接下来了解了一种初级图像的混合——线性混合操作,理论公式:g(x)=(1-a)*f1(x)+a*f2(x);运用了OpenCV
中addWeighted函数可以达到操作的目的。对于addWeighted,原型如下:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1