天天看點

Win7下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為例。
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
安裝好CMake,開始編譯opencv:
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
opencv源碼存放的路徑以及編譯輸出的路徑不能有中文,否則容易出錯,還有在編譯過程中會在在一些檔案主要是ffmpeg和ippicv,下載下傳很慢可能會出錯,
這時可以直接去網上下載下傳對應版本的檔案放到源碼中的.cache檔案夾,再重新configure。
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
如果不知道要下載下傳那個版本的ffmpeg和ippicv,可以打開源碼中的3rdparty/ffmpeg/ffmpeg.cmake和3rdparty/ippicv/ippicv.cmake檢視。
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
configure成功後,在OPENCV_EXTRA_MODULES_PATH 的屬性下配置路徑,在CMAKE_INSTALL_PREFIX 處可以修改VS編譯後的安裝路徑,
若要區分Debug和Release,可以AddEntry,設定CMAKE_DEBUG_POSTFIX 的值為d,每次修改都configure一下,以防出錯。
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
對于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,成功後就可以繼續下一步編譯了。
           

3.用VS2013編譯opencv

這裡我遇到了各種錯誤,首先在Debug模式下,右擊ZERO_CHECK項目,點選Build;再切換到Release模式下,
右擊ZERO_CHECK項目,點選Build,很成功,但當我右擊INSTALL項目,點選Build,不一會兒就出錯了,如下
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
于是在網上找了許多方法,可是好像沒啥用,後來我對每一個項目單獨編譯發現有的項目成功了,有的會出現一些錯誤,如缺少.lib丢失的錯誤,
這是因為有的比較重要的檔案沒有編譯成功。
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
這裡我單獨編譯的opencv_core有一個失敗了,出現MSB6006等錯誤,我估計是cuda的問題,網上查了很多都沒講重點,
後來我重新編譯了一遍并把CUDA_ARCH_BIN的值改為了5.0,5.2,再用VS編譯時這個錯誤就沒了,我也不大清楚為什麼。
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
總之,在生成時建議不要直接INSTALL,把一些較大的項目如module等先單獨生成,如果有項目出錯可以單獨解決,如我就遇到這樣的錯誤:
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
解決方法是點選“項目” -屬性- 配置屬性 - 連結器 - 進階 - 無入口點 選擇"是(/NOENTRY)"。把主要的項目生成完後一定要再INSTALL。
我就是忘記INSTALL,當我滿懷期待的測試代碼的時候,編譯順利地通過了,但運作時就打開一個cmd視窗直接死循環,啥都不顯示。調試時出現opencv
相關的.lib檔案無法查找或打開PDB檔案的錯誤,在網上找了半天都沒有解決,最後我把源碼再INSTALL了一遍才解決。好了,到這裡Debug已經編譯完了,
Release的編譯與Debug相同。希望這篇部落格能幫你們少走點彎路吧。
           

4.opencv 配置及測試

編譯好後,在找到install檔案夾,可以将其拷貝到其他地方,在計算機屬性裡面配置opencv中bin的環境
           
Win7下Cmake編譯配置opencv3.3+contrib+cuda7.5
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 <= ){
        cerr << "There is no device." << endl;
        return -;
    }

    int enable_device_id = -;
    for (int i = ; i < num_devices; i++){
        cv::cuda::DeviceInfo dev_info(i);
        if (dev_info.isCompatible()){
            enable_device_id = i;
        }
    }

    if (enable_device_id < ){
        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 -;
    }
    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, -, , );
    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) /  << "s\n";
    waitKey();
    return ;
}
           
最後對比了一下使用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

繼續閱讀