您的位置:首页 > 运维架构

配置OpenCV2和OpenCV3开发环境笔记

2016-01-20 14:21 232 查看

配置OpenCV2和OpenCV3开发环境笔记

Date: 2016-01-19

Author: Kagula

Environment:

Visual Studio 2013 Update5, OpenCV 2.4.11, OpenCV 3.1.0, GTX960, CUDA 7.5.18

Prologue:

如何搭建OpenCV 2.4.11、OpenCV 3.1.0的开发环境。

OpenCV 2.4.11是从官网直接下载已经编译好的包。

OpenCV 3.1.0是从官网下载源代码自己编译(据说支持CUDA的lib得自己编译)。

这里最坑的是,官网的例子没有更新,后来还是在参考资料[4]中找到了正确的示例代码。

第一部份:确认开发环境没有异常(OpenCV 2.4.11)

新建空的win32 console solution,配置project属性。

头文件搜索路径

D:\sdk\OpenCV2411\opencv\build\include;

库文件搜索路径

D:\sdk\OpenCV2411\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

使用下面的代码测试

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

#include <opencv2\imgproc\imgproc.hpp>

#include "counter.h"

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
try
{
cv::Mat src = cv::imread("C:\\Users\\kagula\\Pictures\\a.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat dst;
//
startTiming();
cv::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);

//Visual studio in Debug mode, Core i7-4790k, GTX960
//take time is 0.200711ms
cout << "take time is " << stopTiming() << "ms" << endl;

//cv::imshow("Result", dst);
//cv::waitKey();
cin.get();
}
catch (const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
return 0;
}


确认当前OpenCV开发环境正常。

第二部份:确认下CUDA环境正常(需要OpenCV3)

第一步:建立CUDA开发环境

在下面网址查到GTX960兼容CUDA 5.2。Quadro K600兼容3.0。
https://developer.nvidia.com/cuda-gpus#collapse4
在下面网址下载并安装CUDA开发工具
http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_windows.exe http://developer.download.nvidia.com/compute/cuda/3_1/toolkit/cudatoolkit_3.1_win_64.exe


第二步:
使用CMake编译出OpenCV 3.1.0

注意要选择visual studio 12 2013 Win64.

否则会报

CUDA_nppc_LIBRARY

CUDA_nppi_LIBRARY

CUDA_npps_LIBRARY

三个环境变量问题,那是因为它们,Nvidia只提供64位库。

Core i7-4790K要编译二个多小时,请耐心等待。

"D:\sdk\opencv-3.1.0\opencv-3.1.0\include"少头文件的问题。

把“D:\sdk\opencv-3.1.0\opencv-3.1.0\modules\XXX\include”下(至少有十多个)的文件复制到

“D:\sdk\opencv-3.1.0\opencv-3.1.0\include”其中“D:\sdk\opencv-3.1.0”是我解压路径。

最后一步:

新建空的Win32 Console Solution,并修改缺省platform为Win64。

现在设置项目的属性

头文件搜索路径

D:\sdk\opencv-3.1.0\opencv-3.1.0\include;

库文件搜索路径

D:\sdk\opencv-3.1.0\opencv-3.1.0\build_vs2013\lib\Debug;

Debug模式下的依赖库

opencv_calib3d310d.lib       

opencv_core310d.lib          

opencv_cudaarithm310d.lib    

opencv_cudabgsegm310d.lib    

opencv_cudacodec310d.lib     

opencv_cudafeatures2d310d.lib

opencv_cudafilters310d.lib   

opencv_cudaimgproc310d.lib   

opencv_cudalegacy310d.lib    

opencv_cudaobjdetect310d.lib 

opencv_cudaoptflow310d.lib   

opencv_cudastereo310d.lib    

opencv_cudawarping310d.lib   

opencv_cudev310d.lib         

opencv_features2d310d.lib    

opencv_flann310d.lib         

opencv_highgui310d.lib       

opencv_imgcodecs310d.lib     

opencv_imgproc310d.lib       

opencv_ml310d.lib            

opencv_objdetect310d.lib     

opencv_photo310d.lib         

opencv_shape310d.lib         

opencv_stitching310d.lib     

opencv_superres310d.lib      

opencv_ts310d.lib            

opencv_video310d.lib         

opencv_videoio310d.lib       

opencv_videostab310d.lib 

Dll复制

"D:\sdk\opencv-3.1.0\opencv-3.1.0\build_vs2013\bin\Debug"下的DLL复制到

我们solution的Debug目录下。

下面是测试OpenCV3.1.0的源码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudaarithm.hpp>

#include "counter.h"

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
try
{
//png图片会抛出异常
cv::Mat src_host = cv::imread("C:\\Users\\kagula\\Pictures\\a.jpg", CV_LOAD_IMAGE_GRAYSCALE);

startTiming();

cv::cuda::GpuMat dst, src;
src.upload(src_host);

//
cv::cuda::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);

//
cv::Mat result_host;
dst.download(result_host);

//Visual studio in Debug mode, Core i7-4790k, GTX960
//take time is 2612.96ms, Release mode 520.587ms.
cout << "take time is " << stopTiming() << "ms" << endl;

//cv::imshow("Result", result_host);
//cv::waitKey();
cin.get();
}
catch (const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
return 0;
}


成功编译并通过。

发现OpenCV3 with CUDA要比OpenCV2 with cpu慢上千倍,主要是多了数据uploaddownload的时间。

参考资料

[1]《在CentOS系统上编译、安装、配置OpenCV》
http://blog.csdn.net/dupei/article/details/6430766
[2]《CUDA Zone》官网地址
https://developer.nvidia.com/cuda-zone
[3]《OpenCV 3.1.0文档》
http://docs.opencv.org/3.1.0/
[4]如何编译OpenCV3.1.0写的比我细。
http://johnhany.net/2015/10/windows7-compile-opencv3-with-cuda/


补充读物


[1]《OpenACC Toolkit》
https://developer.nvidia.com/openacc
[2]一些OpenCV如何使用的介绍
http://www.opencv.org.cn
[3]《OpenCV中GPU模块使用》
http://www.cnblogs.com/dwdxdy/p/3244508.html
[4]《OpenCV学习:将图像转为二值图像(函数cvtColor和函数threshold)》
http://blog.sina.com.cn/s/blog_59fabe030101ib67.html
常见问题

Q1 The library is compiled without CUDA support in function EmptyFuncTable::mallocPitch


http://stackoverflow.com/questions/32774673/no-gpu-support-using-opencv-2-4-10-cuda-7-5-w10
Q1 找不到cv::gpu::threshold定义的问题


http://johnhany.net/2015/10/windows7-compile-opencv3-with-cuda/
补充

[1]如果要全局设置头文件和库文件搜索路径,据说可在[Visual Studio]->[View]->[Propery Manager]中设置。

有时间再测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV2 OpenCV3