2017-08-03,OpenCV发布了3.3版本,
通过http://opencv.org/releases.html,选择Win pack下载opencv-3.3.0-vc14.exe,通过安装后可以看到安装目录中只有x64的完整的bin和lib。
这就说明,OpenCV 3.3的Win版本,默认只支持Win 64位的操作系统开发。当前,还有很多公司由于驱动开发等原因,电脑使用的还是32位操作系统。
那么如何在Win 32的电脑上使用OpenCV 3.3开发?
要解决这个问题,只有我们自己去编译OpenCV 3.3的sources,从而获得这个版本的32位的bin文件和lib库文件,来搭建我们需要的开发环境。
编译OpenCV 3.3,需要下载安装CMake,我使用的是3.9.2版本,编译的过程如下。
(1)将openv安装目录下的sources文件路径载入CMake中,并且设置好生成opencv工程的路径,如下图所示。
(2)设置上述两个路径后,点击Configure按钮,选择安装的Visual Studio的版本,点击Finish后,CMake开始工作,结束后出现Configuring done字样,如下:
(3)上图可以看出有些红色部分,再点击一次Configure,红色部分消失,再次出现Configuring done:
(4)完成Configure后,点击Generate,出现Generating done。
(5)打开先前设置的目标路径D:\opencv_sources_build,目标路径中通过CMake生成了opencv的vs2017的解决方案OpenCV.sln。
点击(4)图中的Open Project,通过vs2017打开OpenCV.sln
通过“解决方案资源管理器”下面的“解决方案和文件夹”按钮,
可以将解决方案切换到传统的文件夹视图,这样可以vs2017中查看整个OpenCV的项目。
(6)这里以“Debug|Win32”为例,查看此时解决方案的配置是否为“Debug|Win32”,这里以如果不是,需要选择“Debug|Win32”。
(7)在解决方案上右键,在弹出菜单中点击生成解决方案,等待几分钟后,生成完成并输出。
(8)生成成功后,我们查看OpenCV的项目目录,发现目录中多了两个文件夹分别为bin和lib,生成文件如下图所示。
在OpenCV的安装目录下,参照build目录下x64的文件夹结构,建立x86的文件夹结构,将bin和lib两个文件夹下的Debug目录下的文件全部拷贝到x86的相应文件夹中。
接下来对vs2017进行相关的编译和调试配置,以便于在vs2017中轻松的进行OpenCV的开发,主要步骤如下。
(1)将C:\Program Files\opencv\build\x86\vc14\bin配置到环境变量中的系统变量Path中。
(2)新建一个空项目如opencvconfig,添加一个源文件main.cpp。主要需要配置为“Debug|Win32”。
(3)【视图】->【其他窗口】->【属性管理器】,点击【Debug|Win32】->【Microsoft.Cpp.Win32.user】打开属性页,开始配置:
首先在【通用属性】 ->【VC++目录】 ->【包含目录】中添加上:
D:\Program Files\opencv\build\include
D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2 这三个目录。
其次在【通用属性】 ->【VC++目录】 ->【库目录】中,添加C:\Program Files\opencv\build\x86\vc14\lib这个路径(注意对应OpenCV的安装路径)。
最后在【通用属性】 ->【链接器】->【常规】 ->【附加库目录】中添加C:\Program Files\opencv\build\x86\vc14\lib这个路径,在【通用属性】 ->【链接器】->【输入】 ->【附加依赖项】中添加附加库目录中的各个lib库,
opencv_calib3d330d.lib
opencv_core330d.lib
opencv_dnn330d.lib
opencv_features2d330d.lib
opencv_flann330d.lib
opencv_highgui330d.lib
opencv_imgcodecs330d.lib
opencv_imgproc330d.lib
opencv_ml330d.lib
opencv_objdetect330d.lib
opencv_photo330d.lib
opencv_shape330d.lib
opencv_stitching330d.lib
opencv_superres330d.lib
opencv_ts330d.lib
opencv_video330d.lib
opencv_videoio330d.lib
opencv_videostab330d.lib
经过上述的配置后,我们写一个测试用例来验证。在opencvconfig项目的main.cpp中添加下面的代码。
#include
#include
#include
using namespace cv;
int main()
{
Mat img = imread("D:\\vs2017_projects\\opencvconfig\\test.jpg", 1);
if (img.empty())
{
fprintf(stderr, "Error:load image failed.");
system("pause");
return -1;
}
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", img);
//cvWaitKey(0);
waitKey();
system("pause");
return 0;
}
代码添加完成后,生成解决方案,然后运行,结果如下图。
在运行时,碰到了下面几个问题,根据网上的文档和个人调试,总结如下。
(1)读取图片失败为空
运行时,根据log,可以看出imread读取图片失败,这时需要检查图片文件的路径,在代码中,应该填写图片的绝对路径,例如本例中,图片存放路径为
"D:\\vs2017_projects\\\Project1\\test.jpg"。
(2)运行时,出现无法查找或者打开PDB文件
【调试】 ->【选项】->【常规】,勾选“启用源服务器支持”
【调试】 ->【选项】->【符号】,勾选“Microsoft符号服务器”
(3)图片不能显示,imshow显示不出来对应的文件,一定要在imshow()后添加cvWaitKey(0)或者waitKey(),否则会出现下面的情况
程序能正常运行,imread()图片读取成功,就是图片一直不能出来。