像一个无头苍蝇一样乱飞了一个月,总算把visual studio上的OpenCV配置成功了,并且还成功运行了两个图像处理的程序。
先下载对应版本的Visual Studio与OpenCV,本人使用的是Visual Studio 2010与OpenCV 2.4.9,这种组合经本人多次测试是出差错最少的。下载链接如下:
Visual Studio 2010下载(密码:kn9b)
OpenCV 2.4.9下载(密码:uevz)
下面介绍配置VS OpenCV的步骤:
这样就算成功建立了一个项目的解决方案。
2.解压OpenCV,设置环境变量
选择一个合适的路径,解压刚刚下载的OpenCV(本人解压的位置为E盘下):
点击其中的“Extract”按钮,进行解压。OpenCV中的库很多,解压之后文件夹很大,解压也需要一段时间。
解压完成后,可以看到E:\opencv的路径里面出现了两个文件夹build与sources:
依次打开:“此电脑”→“属性”→“高级系统设置”→“环境变量”,找到其中的环境变量PATH,对其值进行设置(用户变量和系统变量中的PATH都要设置):
在系统的PATH的环境变量里面,增加一个值,这个值是OpenCV中x86架构里面的vc10中的bin路径,以之前解压的OpenCV路径为例,那么这个值就应该设置为:
E:\opencv\build\x86\vc10\bin
对应的在用户环境变量里面修改PATH的值也为此值:
做到这里,这一步就算完成了。
3. 设置Visual Studio的编译选项
在Visual Studio中打开之前建立的项目解决方案,点击其中的“属性管理器”中的“Debug | Win32”,对其中的一些选项进行设置:
点击其中的“VC++ 目录”。对里面的包含目录和库目录进行修改:
包含目录要设置三个值,分别为OpenCV里build底下的include三路径(以本人解压的路径为例):
E:\opencv\build\include
E:\opencv\build\include\opencv2
E:\opencv\build\include\opencv
库目录设置为build里面vc10中的lib的路径:
E:\opencv\build\x86\vc10\lib
接下来设置属性页里面的链接器:
点击链接器里面的输入,就会弹出上面的界面,在“附加依赖项“里面增加以下的库文件即可:
opencv_calib3d249.lib
opencv_calib3d249d.lib
opencv_contrib249.lib
opencv_contrib249d.lib
opencv_core249.lib
opencv_core249d.lib
opencv_features2d249.lib
opencv_features2d249d.lib
opencv_flann249.lib
opencv_flann249d.lib
opencv_gpu249.lib
opencv_gpu249d.lib
opencv_highgui249.lib
opencv_highgui249d.lib
opencv_imgproc249.lib
opencv_imgproc249d.lib
opencv_legacy249.lib
opencv_legacy249d.lib
opencv_ml249.lib
opencv_ml249d.lib
opencv_nonfree249.lib
opencv_nonfree249d.lib
opencv_objdetect249.lib
opencv_objdetect249d.lib
opencv_ocl249.lib
opencv_ocl249d.lib
opencv_photo249.lib
opencv_photo249d.lib
opencv_stitching249.lib
opencv_stitching249d.lib
opencv_superres249.lib
opencv_superres249d.lib
opencv_ts249.lib
opencv_ts249d.lib
opencv_video249.lib
opencv_video249d.lib
opencv_videostab249.lib
opencv_videostab249d.lib
这些库文件都在本人的“E:\opencv\build\x86\vc10\lib”路径里面。
做完这一步,所有的配置工作就算大功告成了。接下来就可以来测试程序了。
先在之前项目解决方案里面增加一个.cpp文件,文件名自取,只要满足变量命名规则就行:
下面是要进行测试的代码:
/*Please copy the file 'shantang.jpg' to D disk before running the program*/
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("D:\\shantang.jpg");
if(!img.data)
{
cout<<"Fail to read the image file 'img'"<
以上代码的功能是显示一张图片,图片的路径在D盘底下,在运行程序之前,先得把你要显示的这张图片拷贝到D盘的路径下。将其中的解决方案配置设置为:“Debug | Win32”,再编译,运行:
其中shantang.jpg为:
正常运行的结果为:
简要说一下以上程序的逻辑:
1.Mat变量是一个图片类,可见简单地理解为用来定义一个与图片有关的变量;
2.imread函数用来读取某一指定路径下的图片,此函数在读取图片时有可能出现异常的情况,即读取的图片内容为空,此时就需要有良好的容灾机制,即读取图片为空时打印错误信息,结束进程,此举在本人imread下一行的代码里面有体现;
3.namedWindow函数,作用是建立一个图片显示窗口,其中的参数即窗口的名字;
4.imshow函数,作用是之前建立的图片显示窗口中添加要显示的图片,第一个参数是之前建立的窗口的名字,第二个是之前定义并读取的Mat类的变量;
5.waitKey函数,作用是设置图片的显示时间;
大功告成,所有的工作全部结束了。
此情况只有可能是你在设置编译选项时没有设置正确,此时就需要重新按照本人之前讲述的步骤重新做一遍,如果重做一遍还是不行,就换成Release解决方案进行配置,然后再去编译。当图中的红色波浪线全部消失之后,方可编译通过。
2.编译通过,但抛出了“找不到XXX.dll文件”的错误
出现此情况有三点可能,第一,是你的环境变量设置不正确;第二,是你所在路径里面的库文件确实没有此项;第三,是C盘底下的system文件夹下的System32文件夹里没有此项。
针对以上的三种可能错误,需逐一排除,先检查环境变量,看看其值是否设置正确,然后再转到“E:\opencv\build\x86\vc10\bin”的路径底下,检查你是否有这个动态库文件,如果没有,就需要把之前的OpenCV删了之后再重新解压一遍。若还不是此原因,则极有可能是因为第三点,此时最简单粗暴的做法就是把“E:\opencv\build\x86\vc10\bin”的路径底下的所有.dll文件拷贝到“C:\Windows\System32”的路径下。
3.编译通过,也运行了,但是运行结果出乎意料
这就说明之前建立容灾机制是明智而正确的,本人后来检查代码,发现错误出现在这里:
首先,imread中的参数一定是图片的绝对路径,不能是相对路径,而且这个路径一定要书写正确,绝对不能出一点差错,后来,本人把imread中的参数改为“D:\shantang.jpg”之后,仍然运行出现此结果,后来才明白,C/C++中的‘\’字符在书写时其实是‘\’,所以正确修改应该是“D:\shantang.jpg”,就连文件名的大小写都得小心翼翼,不得出错,为了方便程序的调试,建议读者存放此时图片的路径尽可能地简单,而且路径名里面不要出现空格字符或斜杠字符。、
以上就是本人对于这一个月以来配置OpenCV和测试程序的全部经验分享。本人有利用Visual Studio和OpenCV处理图像的程序源码,在这里分享一波,此GitHub链接里面的源码会实时更新,请及时关注:
图像处理源码GitHub链接