《OpenCV图像处理编程实例》
《OpenCV图像处理编程实例》例程复现
随书代码下载:http://www.broadview.com.cn/28573
总结+遇到的issue解决:
第一章 初识OpenCV
1.VS2015安装OpenCV2.4.11
四步骤:
1)步骤一:下载Windows安装包OpenCV2.4.11并解压,本人为:D:\ProgramFiles\opencv2
2)步骤二:配置OpenCV2.4.11的环境变量,本人为:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin
注意:此处实际此处与系统32位还是64位无关,而与在VS2015工程项目中配置的平台相关,所以,本人电脑64位系统,若添加D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin,在VS2015工程项目中配置的平台中选择x86,而若若添加D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin 和 D:\ProgramFiles\opencv2\opencv\build\x64\vc12\bin,在VS2015工程项目中配置的平台选择x86和x64均可,但是步骤三配置VS工程目录要对应。
3)步骤三:配置VS工程目录
包括:新建空白项目Win32控制台应用程序,属性页面:配置:选择“Debug”平台选择“Win32”需要配置3处:VC++目录(包含目录、库目录)和链接器——“输入”(附加依赖项)
选择“Release”平台选择“Win32”需要配置3处:同上。
本人配置的为:配置:选择“Debug”平台选择“Win32”需要配置3处:VC++目录(包含目录:D:\ProgramFiles\opencv2\opencv\build\include、D:\ProgramFiles\opencv2\opencv\build\include\opencv、D:\ProgramFiles\opencv2\opencv\build\include\opencv2;库目录:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\lib)和链接器——“输入”(附加依赖项:opencv_calib3d2411d.lib
opencv_contrib2411d.lib
opencv_core2411d.lib
opencv_features2d2411d.lib
opencv_flann2411d.lib
opencv_gpu2411d.lib
opencv_highgui2411d.lib
opencv_imgproc2411d.lib
opencv_legacy2411d.lib
opencv_ml2411d.lib
opencv_nonfree2411d.lib
opencv_objdetect2411d.lib
opencv_ocl2411d.lib
opencv_photo2411d.lib
opencv_stitching2411d.lib
opencv_superres2411d.lib
opencv_ts2411d.lib
opencv_video2411d.lib
opencv_videostab2411d.lib)
配置:选择“Release”平台选择“Win32”需要配置3处:VC++目录(包含目录:D:\ProgramFiles\opencv2\opencv\build\include、D:\ProgramFiles\opencv2\opencv\build\include\opencv、D:\ProgramFiles\opencv2\opencv\build\include\opencv2;库目录:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\lib)和链接器——“输入”(附加依赖项:opencv_calib3d2411.lib
opencv_contrib2411.lib
opencv_core2411.lib
opencv_features2d2411.lib
opencv_flann2411.lib
opencv_gpu2411.lib
opencv_highgui2411.lib
opencv_imgproc2411.lib
opencv_legacy2411.lib
opencv_ml2411.lib
opencv_nonfree2411.lib
opencv_objdetect2411.lib
opencv_ocl2411.lib
opencv_photo2411.lib
opencv_stitching2411.lib
opencv_superres2411.lib
opencv_ts2411.lib
opencv_video2411.lib
opencv_videostab2411.lib)
注意:(1)以本人配置的位列,若要配置64位系统的库目录应为:D:\ProgramFiles\opencv2\opencv\build\x64\vc12\lib
(2)若库目录配置为staticlib,这样开发出来的软件将包含opencv库,可以运行于没有安装配置OpenCV开发环境的系统中。如若配置,库目录应为:D:\ProgramFiles\opencv2\opencv\build\x64\vc12\staticlib
4)步骤四:测试OpenCV开发环境是否正确配置。
注意:此处的图像地址一定要正确,本人的是:D:\\Working\\opencvimg\\images\\flower.jpg
2.Sublime下配置OpenCV
1)Sublime下载及汉化:http://www.onlinedown.net/soft/68602.htm
详细配置建议参考Lucida的博文:http://zh.lucida.me/blog/sublime-text-complete-guide/
安装后要配置环境变量,本人的为:C:\Program Files (x86)\Sublime Text 3
2)下载安装MinGW
下载:https://sourceforge.net/projects/mingw/
本人网络特慢,所以给出其他下载链接:https://jingyan.baidu.com/article/0320e2c11564ca1b87507b8f.html
安装后要配置环境变量,本人的为:D:\ProgramFiles\MinGW-V5.1.6\MinGW\bin
测试:测试是否安装及配置成功,windows + r 组合键调出命令提示符,然后输入cmd,然后输入gcc -v,没有报错的话,说明安装配置成功。
3)下载安装OpenCV,制作MinGW版本库。
Sublime下需要利用MinGW进行编译链接OpenCV2.4.x,因此需要配置响应的环境变量,而2.4.4配置为D:\ProgramFiles\opencv2。4.4\opencv\build\x86\mingw\bin,但是2.4.11没有此文件夹
说明:opencv2.4.4官网的后续OpenCV2.4.x软件开发包没有提供相关的MinGW版本库,若使用新版本,需要通过CMake来自己制作。
具体方法为:Windows平台安装最新OpenCV-2.4.9,利用Eclipse、MinGW构建C++调用OpenCV开发环境——https://blog.****.net/yanzi1225627/article/details/26408579
还要参看本人另一篇博客:OpenCV+Qt+CMake安装+十种踩坑
这篇博客是QT的MinGW编译OpenCV,里边附带CMake的下载,安装及编译过程。
CMake来自己制作MinGW库要到的issue汇总(1)OpenCV 2.4.11 Compile Issues in “operations.hpp”4101
error: got 2 template parameters but 1 required
解决:打开operations.hpp将4098-4105此函数注释
参考:https://stackoverflow.com/questions/11777958/opencv-2-4-2-compile-issues-in-operations-hpp
https://blog.****.net/jacke121/article/details/56038046
(2)D:\ProgramFiles\opencv2\opencv\sources\modules\highgui\src\window_w32.cpp:1853: error: `BTNS_AUTOSIZE' was not declared in this scope
D:\ProgramFiles\opencv2\opencv\sources\modules\highgui\src\window_w32.cpp:1853: error: `BTNS_BUTTON' was not declared in this scope
解决:打开window_w32.cpp在1850-1851行加入:
const int BTNS_AUTOSIZE = 0;
const int BTNS_BUTTON = 0;
(3)出现[100%] Built target opencv_annotation 表明编译好了
安装后要配置环境变量,本人的为:D:\ProgramFiles\opencv2\opencv\build\x86\mingw\bin
4)新建编译系统OpenCV
打开Sublime界面,选择工具——>编译系统——>新编译系统——>新建my_opencv.sublime-build文件,输入代码:
{
"cmd": ["g++", "${file}", "-o",
"${file_path}/${file_base_name}","-I",
"D:/ProgramFiles/opencv2/opencv/build/include",
"-I","D:/ProgramFiles/opencv2/opencv/build/include/opencv","-I",
"D:/ProgramFiles/opencv2/opencv/build/include/opencv2","-L",
"D:/ProgramFiles/opencv2/opencv/build/x86/mingw/lib",
"-l", "opencv_core2411", "-l", "opencv_imgproc2411",
"-l", "opencv_calib3d2411","-l", "opencv_video2411",
"-l", "opencv_features2d2411", "-l", "opencv_ml2411", "-l",
"opencv_highgui2411","-l", "opencv_objdetect2411", "-l",
"opencv_legacy2411", "-l", "opencv_flann2411"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++, source.cpp",
"encoding": "gbk",
"variants":
[
{
"name": "Run",
"cmd" : ["${file_path}/${file_base_name}"]
}
]
}
注意:上述代码的3到6行需要更改为自己的实际路径。8到11行为编译连接需要用到的dll,在Opencv\build\x64\mingw\bin目录下可以看到这些dll,将它们按照文件夹中的实际名称更改到代码中,名称中的数字是对应的版本号,名称前缀可以用opencv,也可以用libopencv,注意不要遗漏,否则无法通过编译。完成之后,在工具-编译系统中选择刚才新建的my_opencv,之后就可以编译运行了。
详细参看:将Sublime Text 3打造成OpenCV3.2的IDE
如何编译运行:使用的时候,在选中了一个*.cpp文件,在键盘上输入**ctrl+b**(如果是第一次的话,会弹出下面的框,让你来选;否则就会需要输入ctrl+shift+b 这里关于输入法的必须选英文,否则会有表情包出来的。。)
本人操作:工具——>用什么编译(ctrl+shift+b)
第一个 my_opencv : 这个会编译当前文件。
第二个 my_opencv-Run就是只运行编译后的文件,如果不编译,无法运行。
详细参看:https://blog.****.net/a19990412/article/details/82658981
问题:代码1-7运行总是报错 *.exe无法工作。
说明:Sublime测试代码1-3没有问题,把1-7逐行注释测试,发现运行到cv::warpAffine(srcImage, rotateImg, rotateImage,srcImage.size());无法运行,可知其无法运行经过复杂运算的图像,可能是太小的缘故。
第二章 图像及视频基本操作
1.Mat基本操作
1)convertTo函数?
在使用Opencv中,常常会出现读取一个图片内容后要把图片内容的像素信息转为浮点并把当前的mat作为矩形进行矩阵计算,那么这里就有一个类型转换问你,在新的opencv中mat有一个函数可以用于类型的相互转换
ocIMat:convertTo(oclMat& m,int rtype,double alpha=1,double beta=0)
m:转为目标数据类型的矩阵;
rtype:指定目标数据类型,或者是depth(通道数),如果rtype:是负值,那么目标矩阵的数据类型和源矩形的数据类型是一致的;
alpha:基于尺度的变化值;
beta:在尺度上的加和;
举例:
cv:Mat matTemp=cv:Mat:zeros(100,100,CV_32F);//得到一个浮点型的100*100的矩阵
cv:Mat MatTemp2;
matTemp.convertTo(MatTemp2,CV8U);//把矩阵matTemp转为unsing char类型的矩阵,注意在转换过程中有可能数值上会出现一些变化,这个要注意
参看链接:http://www.360doc.com/content/16/1202/09/35269117_611224795.shtml
2)blur函数?什么是锚点?
锚点(即被平滑的那个点)
3)
2