Cmake编译配置opencv3.3+contrib+cuda7.5

这次配置cuda加速真是遇到各种错误,前后折腾了三四天才总算成功了。下面是我的编译配置opencv的步骤以及遇到的一些坑。

1.准备工作

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


2.编译opencv源码

cuda 的安装很简单,下载电脑支持的cuda版本,直接安装就可以了。不需要手动进行配置,如果想验证CUDA是否配置正确,可以尝试编译任意一个CUDA自带的样例程序。
这里以deviceQuery为例。

这里写图片描述

这里写图片描述

安装好CMake,开始编译opencv:

这里写图片描述
这里写图片描述

opencv源码存放的路径以及编译输出的路径不能有中文,否则容易出错,还有在编译过程中会在在一些文件主要是ffmpeg和ippicv,下载很慢可能会出错,
这时可以直接去网上下载对应版本的文件放到源码中的.cache文件夹,再重新configure。
  • 1
  • 2
  • 3

这里写图片描述

如果不知道要下载那个版本的ffmpeg和ippicv,可以打开源码中的3rdparty/ffmpeg/ffmpeg.cmake和3rdparty/ippicv/ippicv.cmake查看。
  • 1
  • 2

这里写图片描述
这里写图片描述

configure成功后,在OPENCV_EXTRA_MODULES_PATH 的属性下配置路径,在CMAKE_INSTALL_PREFIX 处可以修改VS编译后的安装路径,
若要区分Debug和Release,可以AddEntry,设置CMAKE_DEBUG_POSTFIX 的值为d,每次修改都configure一下,以防出错。
  • 1
  • 2
  • 3

这里写图片描述

对于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,成功后就可以继续下一步编译了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.用VS2013编译opencv

这里我遇到了各种错误,首先在Debug模式下,右击ZERO_CHECK项目,点击Build;再切换到Release模式下,
右击ZERO_CHECK项目,点击Build,很成功,但当我右击INSTALL项目,点击Build,不一会儿就出错了,如下
  • 1
  • 2
  • 3

这里写图片描述

于是在网上找了许多方法,可是好像没啥用,后来我对每一个项目单独编译发现有的项目成功了,有的会出现一些错误,如缺少.lib丢失的错误,
这是因为有的比较重要的文件没有编译成功。
  • 1
  • 2
  • 3

这里写图片描述

这里写图片描述

这里我单独编译的opencv_core有一个失败了,出现MSB6006等错误,我估计是cuda的问题,网上查了很多都没讲重点,
后来我重新编译了一遍并把CUDA_ARCH_BIN的值改为了5.0,5.2,再用VS编译时这个错误就没了,我也不大清楚为什么。
  • 1
  • 2
  • 3

这里写图片描述

总之,在生成时建议不要直接INSTALL,把一些较大的项目如module等先单独生成,如果有项目出错可以单独解决,如我就遇到这样的错误:
  • 1
  • 2

这里写图片描述

解决方法是点击“项目” -属性- 配置属性 - 链接器 - 高级 - 无入口点 选择"是(/NOENTRY)"。把主要的项目生成完后一定要再INSTALL。
我就是忘记INSTALL,当我满怀期待的测试代码的时候,编译顺利地通过了,但运行时就打开一个cmd窗口直接死循环,啥都不显示。调试时出现opencv
相关的.lib文件无法查找或打开PDB文件的错误,在网上找了半天都没有解决,最后我把源码再INSTALL了一遍才解决。好了,到这里Debug已经编译完了,
Release的编译与Debug相同。希望这篇博客能帮你们少走点弯路吧。

4.opencv 配置及测试

编译好后,在找到install文件夹,可以将其拷贝到其他地方,在计算机属性里面配置opencv中bin的环境

这里写图片描述

VS2013配置opencv可以新建一个属性表添加到项目里面,以下为属性表里的内容。
<?xml version="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 <opencv2/opencv.hpp>
#include<opencv2/cudaimgproc.hpp> 
#include <iostream>
#include <time.h>

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处理的时间,发现好像没有快多少,不过这只是一个小程序,所以处理时间没太大的差别

猜你喜欢

转载自blog.csdn.net/maweifei/article/details/81084801