opencv3.3 源文件下载链接:https://github.com/opencv/opencv
opencv_contirb 源文件下载链接:https://github.com/opencv/opencv_contrib
cmake下载链接:https://cmake.org/files/v3.8/cmake-3.8.0-rc4-win64-x64.msi
TBB 4.4 Update 3 下载地址:https://www.threadingbuildingblocks.org/sites/default/files/software_releases/windows/tbb44_20160128oss_win_0.zip
Eigen 3.2.8 下载地址:http://bitbucket.org/eigen/eigen/get/3.2.8.zip
CUDA Toolkit 7.5.18 下载地址:http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_windows.exe
如果嫌官网下载太慢的话可以从这里下载
http://download.csdn.net/download/qq_37837518/10130693
http://download.csdn.net/download/qq_37837518/10131740
http://download.csdn.net/download/qq_37837518/10131764
cuda 的安装很简单,下载电脑支持的cuda版本,直接安装就可以了。不需要手动进行配置,如果想验证CUDA是否配置正确,可以尝试编译任意一个CUDA自带的样例程序。
这里以deviceQuery为例。
安装好CMake,开始编译opencv:
opencv源码存放的路径以及编译输出的路径不能有中文,否则容易出错,还有在编译过程中会在在一些文件主要是ffmpeg和ippicv,下载很慢可能会出错,
这时可以直接去网上下载对应版本的文件放到源码中的.cache文件夹,再重新configure。
如果不知道要下载那个版本的ffmpeg和ippicv,可以打开源码中的3rdparty/ffmpeg/ffmpeg.cmake和3rdparty/ippicv/ippicv.cmake查看。
configure成功后,在OPENCV_EXTRA_MODULES_PATH 的属性下配置路径,在CMAKE_INSTALL_PREFIX 处可以修改VS编译后的安装路径,
若要区分Debug和Release,可以AddEntry,设置CMAKE_DEBUG_POSTFIX 的值为d,每次修改都configure一下,以防出错。
对于cuda 需要勾上WITH_TBB、WITH_IPP、WITH_EIGEN、WITH_CUBLAS、WITH_CUDA和WITH_CUFFT,其中tbb和eigen 需要自己下载并配置路径。
TBB_INCLUDE_DIRS D:/opencv32/tbb/include
TBB_LIB_DIR D:/opencv32/tbb/lib/intel64/vc12
EIGEN_INCLUDE_PATH D:/opencv32/Eigen
注意 D:/opencv32/Eigen 目录下还有一个单独的Eigen, 如 D:/opencv32/Eigen /Eigen/include.
如果想要用opengl,自己去配置好后再选上WITH_OPENGL。再次点击configure后点generate,成功后就可以继续下一步编译了。
这里我遇到了各种错误,首先在Debug模式下,右击ZERO_CHECK项目,点击Build;再切换到Release模式下,
右击ZERO_CHECK项目,点击Build,很成功,但当我右击INSTALL项目,点击Build,不一会儿就出错了,如下
于是在网上找了许多方法,可是好像没啥用,后来我对每一个项目单独编译发现有的项目成功了,有的会出现一些错误,如缺少.lib丢失的错误,
这是因为有的比较重要的文件没有编译成功。
这里我单独编译的opencv_core有一个失败了,出现MSB6006等错误,我估计是cuda的问题,网上查了很多都没讲重点,
后来我重新编译了一遍并把CUDA_ARCH_BIN的值改为了5.0,5.2,再用VS编译时这个错误就没了,我也不大清楚为什么。
总之,在生成时建议不要直接INSTALL,把一些较大的项目如module等先单独生成,如果有项目出错可以单独解决,如我就遇到这样的错误:
解决方法是点击“项目” -属性- 配置属性 - 链接器 - 高级 - 无入口点 选择"是(/NOENTRY)"。把主要的项目生成完后一定要再INSTALL。
我就是忘记INSTALL,当我满怀期待的测试代码的时候,编译顺利地通过了,但运行时就打开一个cmd窗口直接死循环,啥都不显示。调试时出现opencv
相关的.lib文件无法查找或打开PDB文件的错误,在网上找了半天都没有解决,最后我把源码再INSTALL了一遍才解决。好了,到这里Debug已经编译完了,
Release的编译与Debug相同。希望这篇博客能帮你们少走点弯路吧。
编译好后,在找到install文件夹,可以将其拷贝到其他地方,在计算机属性里面配置opencv中bin的环境
VS2013配置opencv可以新建一个属性表添加到项目里面,以下为属性表里的内容。
"1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>D:\opencv32\opencv32_CUDA\include;$(IncludePath)IncludePath>
<LibraryPath Condition="'$(Platform)'=='X64'">D:\opencv32\opencv32_CUDA\x64\vc12\lib;$(LibraryPath)LibraryPath>
PropertyGroup>
<ItemDefinitionGroup>
<Link Condition="'$(Configuration)'=='Debug'">
<AdditionalDependencies>
opencv_aruco331d.lib;opencv_bgsegm331d.lib;opencv_bioinspired331d.lib;
opencv_calib3d331d.lib;opencv_ccalib331d.lib;opencv_core331d.lib;
opencv_cudaarithm331d.lib;opencv_cudabgsegm331d.lib;opencv_cudacodec331d.lib;
opencv_cudafeatures2d331d.lib;opencv_cudafilters331d.lib;opencv_cudaimgproc331d.lib;
opencv_cudalegacy331d.lib;opencv_cudaobjdetect331d.lib;opencv_cudaoptflow331d.lib;
opencv_cudastereo331d.lib;opencv_cudawarping331d.lib;opencv_cudev331d.lib;
opencv_dnn331d.lib;opencv_dpm331d.lib;opencv_features2d331d.lib;
opencv_flann331d.lib;opencv_fuzzy331d.lib;opencv_highgui331d.lib;
opencv_img_hash331d.lib;opencv_imgcodecs331d.lib;opencv_imgproc331d.lib;
opencv_line_descriptor331d.lib;opencv_ml331d.lib;opencv_objdetect331d.lib;
opencv_phase_unwrapping331d.lib;opencv_photo331d.lib;opencv_plot331d.lib;
opencv_reg331d.lib;opencv_rgbd331d.lib;opencv_saliency331d.lib;
opencv_shape331d.lib;opencv_stereo331d.lib;opencv_stitching331d.lib;
opencv_structured_light331d.lib;opencv_superres331d.lib;opencv_video331d.lib;
opencv_videoio331d.lib;opencv_videostab331d.lib;
%(AdditionalDependencies)
AdditionalDependencies>
Link>
<Link Condition="'$(Configuration)'=='Release'">
<AdditionalDependencies>
opencv_aruco331.lib;opencv_bgsegm331.lib;opencv_bioinspired331.lib;
opencv_calib3d331.lib;opencv_ccalib331.lib;opencv_core331.lib;
opencv_cudaarithm331.lib;opencv_cudabgsegm331.lib;opencv_cudacodec331.lib;
opencv_cudafeatures2d331.lib;opencv_cudafilters331.lib;opencv_cudaimgproc331.lib;
opencv_cudalegacy331.lib;opencv_cudaobjdetect331.lib;opencv_cudaoptflow331.lib;
opencv_cudastereo331.lib;opencv_cudawarping331.lib;opencv_cudev331.lib;
opencv_dnn331.lib;opencv_dpm331.lib;opencv_features2d331.lib;
opencv_flann331.lib;opencv_fuzzy331.lib;opencv_highgui331.lib;
opencv_img_hash331.lib;opencv_imgcodecs331.lib;opencv_imgproc331.lib;
opencv_line_descriptor331.lib;opencv_ml331.lib;opencv_objdetect331.lib;
opencv_phase_unwrapping331.lib;opencv_photo331.lib;opencv_plot331.lib;
opencv_reg331.lib;opencv_rgbd331.lib;opencv_saliency331.lib;
opencv_shape331.lib;opencv_stereo331.lib;opencv_stitching331.lib;
opencv_structured_light331.lib;opencv_superres331.lib;opencv_video331.lib;
opencv_videoio331.lib;opencv_videostab331.lib;
%(AdditionalDependencies)
AdditionalDependencies>
Link>
ItemDefinitionGroup>
<ItemGroup />
Project>
配置好环境就可以开始测试一下自己编译的opencv了,哈哈
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
// 初始化cuda
int num_devices = cv::cuda::getCudaEnabledDeviceCount();
if (num_devices <= 0){
cerr << "There is no device." << endl;
return -1;
}
int enable_device_id = -1;
for (int i = 0; i < num_devices; i++){
cv::cuda::DeviceInfo dev_info(i);
if (dev_info.isCompatible()){
enable_device_id = i;
}
}
if (enable_device_id < 0){
cerr << "GPU module isn't built for GPU" << endl;
}
cv::cuda::setDevice(enable_device_id);
// 以下为测试代码
clock_t time1 = clock();
cout << "time1: " << time1 << "ms" << endl;
Mat src = imread("D:/其它/图片/car.jpg", CV_LOAD_IMAGE_COLOR);
Mat dst = Mat::zeros(src.size(),CV_8UC1);
if (src.empty())
{
cout << "读取图片失败!\n";
return -1;
}
imshow("src", src);
cuda::GpuMat cuda_src(src);
cuda::GpuMat cuda_gray,cuda_dst;
cuda::cvtColor(cuda_src, cuda_gray, CV_BGR2GRAY);
cuda::bilateralFilter(cuda_gray, cuda_dst, -1, 50, 7);
cuda_dst.download(dst);
//Canny(dst, dst, 35, 200, 3);
imshow("dst", dst);
imwrite("out.png", dst);
clock_t time2 = clock();
cout << "time2: " << time2 << "ms\ntime: " << (time2 - time1) / 1000.0 << "s\n";
waitKey(0);
return 0;
}
最后对比了一下使用cuda与不使用cuda处理的时间,发现好像没有快多少,不过这只是一个小程序,所以处理时间没太大的差别吧。
参考博客:
http://johnhany.net/2015/10/windows7-compile-opencv3-with-cuda/
https://wenku.baidu.com/view/9893ec57763231126edb11b8.html
http://blog.csdn.net/cv_jason/article/details/70037545