1. 程式人生 > >OpenCV3的GPU模組編譯

OpenCV3的GPU模組編譯

【摘要】

OpenCV3的GPU模組需要手動重新編譯才可以使用。本文介紹了編譯OpenCV3 + GPU模組的方法。

【本文使用的作業系統、軟體版本】

OS:Windows10
OpenCV 3.0.0 
CMake 3.4.0-rc 
CUDA v7.5 for windows10 x86_64 
Visual Studio 2013 Community

【正文】

1.前言

1.1.為什麼要重新編譯?

OpenCV3封裝了許多可以直接從高層呼叫的基於GPU計算的方法。但是直接用官網下載的編譯好的OpenCV3呼叫GPU命令會發生 No CUDA support

 錯誤,如下圖: 
No CUDA support

錯誤描述中說 The library is compiled without CUDA support. 
OpenCV需要和CUDA模組一起編譯,才可以使用GPU介面。

1.2.What is CUDA

NVIDIA官網 https://developer.nvidia.com/cuda-toolkit 的描述如下:

The NVIDIA® CUDA® Toolkit provides a comprehensive development environment for C and C++ developers building GPU-accelerated applications. The CUDA Toolkit includes a compiler for NVIDIA GPUs, math libraries, and tools for debugging and optimizing the performance of your applications. You’ll also find programming guides, user manuals, API reference, and other documentation to help you get started quickly accelerating your application with GPUs.

CUDA toolkit是NVIDIA的一個驅動包,封裝了GPU硬體加速功能,遮蔽了硬體,提供方便呼叫的C/C++程式設計介面。

2.準備工具-安裝CUDA

首先你的電腦需要有獨顯,且你的顯示卡支援CUDA。

2.1.檢查顯示卡是否支援CUDA

注:樓主使用的是N卡(NVIDIA顯示卡),A卡(AMD顯示卡)貌似還不支援CUDA——-就好像天貓買東西不能用微信支付一樣。A卡的童鞋抱歉了。

檢查顯示卡是否支援CUDA步驟如下: 
Ⅰ.檢視自己的顯示卡型號 
[win+R]開啟[執行] -> 輸入[cmd]按回車開啟[命令列] -> 輸入[start devmgmt.msc]按回車開啟[裝置管理器]。 
在顯示介面卡選項中看自己的顯示卡型號。雙顯示卡的童鞋可能有兩個顯示卡,注意要獨顯

那個的型號…樓主的是GeForce GT 640,檢視顯示卡型號如下圖: 
檢視顯示卡型號 
Ⅱ.檢視自己的顯示卡是否支援GPU 
去@Nvidia官網CUDA支援 https://developer.nvidia.com/cuda-gpus 檢視自己的顯示卡是否支援CUDA。

2.2.下載安裝CUDA Tookit

去@Nvidia官網https://developer.nvidia.com/cuda-downloads 選擇系統型號,下載最新的CUDA Tookit,建議[Installer Type]選[exe(local)]。樓主用的是v7.5版本。 
下載後安裝,有三個工具,全裝上,裝的時候不要有中文路徑。建議cuda tookit安裝到一個短一點的路徑下。這個是你以後二次開發用的工具。樓主裝在了@D:\dev\CUDA\v7.5。安裝完建議重啟一下。 
安裝完可以檢查一下環境變數有木有配置好:桌面上此電腦右鍵屬性->高階系統設定->高階系統屬性->高階->環境變數->系統變數中的Path, 如果像@下圖一樣就是裝好了: 
CUDA環境變數 
注意:樓主用的是2015年11月中旬更新之後的windows10,和之前的@win7\8.x\沒更新的10 的Path變數的介面不太一樣。

3.重新編譯OpenCV3

就是用Cmake重新生成一下64位(推薦)的OpenCV3,編譯時勾上WITH_CUDA選項,一般這個預設是勾上的,全按照預設的就行了,注意不要勾BUILD_CUDA_STUBS項。然後再用VS編譯一下。詳細步驟如下。熟悉OpenCV編譯的童鞋可以略過這一步了。

3.1.下載安裝Cmake

去@Cmake官網 https://cmake.org/download/ 下載最新的Cmake工具並安裝。樓主用的是3.4.0-rc版本。 
安裝好後開啟Cmake。

點[Brouse Source…],選擇OpenCV原始碼那個sources資料夾的路徑。 
點[Brouse Build…],選擇要生成的工程的路徑。如下圖: 
CMake配置路徑

點選 [Configure],出現對話方塊說資料夾不存在要不要新建資料夾,點yes,然後出現對話方塊選擇生成的工程版本,如下圖: 
選擇工程版本

樓主選的是VS2013 64位。樓主曾經選過VS2013 32位版本,但這樣做後來的過程中會報錯。建議選64位的。這樣生成的執行庫也是64位。貌似Cuda對64位的支援比較好。

點[Finished],一段讀條後會生成工程。完成後可以檢查一下視窗下部的框,如果正確安裝、配置CUDA,應該會有如下字樣 CUDA detected+版本號: 
CUDA detected

檢查一下WITH_CUDA選項,如果Cmake檢測到你安裝了CUDA,應該是自動勾上的。如果沒自動勾上那就把它勾上。如下圖: 
WITH_CUDA = true

配置工程選項裡有很多有cuda的項,樓主目前用到過的功能勾上這一個WITH_CUDA就夠了,建議就按預設的,不要勾其他的選項。容易出錯。等你成功配置熟悉之後再慢慢玩吧。 
另外要注意的是BUID_CUDA_STUBS這個選項 
千萬不要選!千萬不要選!千萬不要選! 
這個相當於編譯出一個CUDA的空殼子。選了這個就等於你的WITH_CUDA白選了。樓主在這個上面坑了挺久….

確認好選項之後再按[Configure]。出現的紅色的項是有問題的。比如樓主的Python2項。不用python的話去掉麼什麼影響。如果不去掉後期樓主編譯工程的時候會報一個錯缺少標頭檔案,但也不影響使用。

按[Generate]生成工程,如果配置和生成工程完全ok底下應該有Configuring done和Generating done兩行。如下圖: 
Generating done

到這生產原始碼工程就OK了。記住剛剛設定的生成工程的路徑,也就是Cmake介面上的Where to build the binaries:後邊的路徑,找到這個路徑,Cmake就可以關了。 
這個路徑下就是一個生成好的Visual Studio工程。用之前選擇的編譯器(VS2013)開啟OpenCV.sln。如下圖: 
OpenCV.sln

可以欣賞一下OpenCV工程和原始碼。如下圖: 
OpenCV工程

按Ctrl+Alt+F7或者點[BUILD(生成)]->[Rebuild Solution(重新生成解決方案)]。開始編譯。過程約2小時左右,看個電影吧……..

不要CUDA模組的OpenCV編譯大概只需要幾分鐘。但是加上CUDA模組就變得特別特別特別特別。。。慢。。

編譯好後應該不會有什麼錯。如果有一兩個Matlab啊Python啊之類的錯誤請無視之。如果幾十個幾百個錯可能就會很大程度上影響使用了。如果真的出錯,可以注意下錯誤是什麼,一起討論一下。

編譯好後,找到解決方案目錄裡的[CMakeTargets]項展開的[INSTALL]項,右鍵->[Project Only(僅專案)]->[Build Only INSTALL(僅生成INSTALL)]。

再次開啟之前生成工程的目錄,我的是@D:\dev\opencv\opencv300\build20151112 
找到install資料夾。這個資料夾就相當於原裝OpenCV的那個build。只要把OpenCV環境變數指到這個下就能用新編譯的OpenCV了。 
當然隨便改環境變數也是挺麻煩的,樓主推薦大家用以下方法: 
找到原來的OpenCV的build資料夾,樓主的是@D:\dev\opencv\opencv300\build,將這個build資料夾改個名比如改成build_old,然後將新的install資料夾剪下過來,改名為build。這樣就不用重新配置各種路徑了。 
要注意之前如果是64位VC12生成的工程並且用DEBUG編譯的OpenCV,新編譯的OpenCV就只能用VC12 ×64 debug的執行庫。

要注意一下OpenCV3.0自帶編譯好的執行庫只有四個,如下圖: 
原裝lib

而自己編譯後的會有很多,如下圖: 
NewLib
所以工程屬性的[輸入->外部依賴項]需要重設,設成編譯後的lib下所有.lib的檔名即可。

4.測試

4.1.測試程式:顯示OpenCV3的GPU裝置是否OK

搞定之後用VS建一個c++Console程式,如下圖: 
Win32Console

配置偵錯程式。注意用DEBUG x64的,沒有的話新建一個。 
配置好工程屬性中的[包含目錄]、[庫目錄]、[輸入->外部依賴項]。 
修改main函式所在檔案如下:

<span style="color:#565f69"><span style="color:#333333"><code>#include "stdafx.h"
#include <iostream>
#include <opencv2\core\cuda.hpp>

int _tmain(int argc, _TCHAR* argv[])
{
    cv::cuda::DeviceInfo _deviceInfo;
    bool _isDeviceOK = _deviceInfo.isCompatible();
    std::cout << "IsGPUDeviceOK : " << _isDeviceOK << std::endl;
    system("pause");
    return 0;
}</code></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

編譯執行,如果檢測到CUDA模組配置好了且GPU硬體裝置正常,則會出現IsGPUDeviceOK:1,如下圖: 
GPUOK

【參考文獻】

  1. 《OpenCV官方文件》 http://docs.opencv.org/3.0.0/d2/dbc/cuda_intro.html
  2. 淺墨_毛星雲 《玩轉OpenCV原始碼》 http://blog.csdn.net/poem_qianmo/article/details/21974023