Google Code Prettify

2013年11月22日 星期五

編譯OpenCV-2.4.7於Visual Studio 2012使其支援GPU-CUDA

2014.10.03 更新:
找到一篇參考文章
Cuda Tech News: CUDA 5.5 + OpenCV 2.4.9 + Visual Studio 2012

──────────────────────────────────────────────────────

先前在2.4.6版試了很久都失敗,果斷心一橫下載2.4.7來編譯就過了。

然而2.4.7的highgui library不知是否有bug,導致無法將影片讀取進來。暫時的解決辦法是使用2.4.6的highgui library做代替。



安裝環境: (記得先查自己的NVIDIA顯示卡有沒有支援CUDA)

一開始我是先調查如何在OpenCV使用CUDA,結果爬到這篇:
OpenCV學習筆記(四十四)——初探GPU 

裡面提到了「使用GPU模塊,需要在用CMake編譯OpenCV時使其中的WITH_CUDAWITH_TBB的宏生效,為ON。」,因此我再往如何由CMake重新編譯OpenCV的方向查找。

後來參考以下這兩篇,便開始了我的編譯之旅:
如何編譯OpenCV-2.3.x/OpenCV-2.4.x使其支持GPU-CUDA高速運算?
[Solved] Install OpenCV 2.4.6 using Visual Studio 2010 / 2012 in Windows 7 / 8 (FOR 64 bit machine only)

接著來記錄下我嘗試的編譯過程。

首先,使用CMake對於OpenCV進行重新編譯,如下圖。



source code: 選擇opencv所在之資料夾。
build the binaries: 自訂。
Generator for this project: 選擇自己安裝的Visual Studio版本,11 Win64表示2012 64位元。

按下Configure後,將WITH_CUDAWITH_CUBLASWITH_TBB選項打勾。



然後再次Configure。

接著紅色部分可能為TBB_INCLUDE_DIRS,將值的路徑設置好,並再次Configure。
直到沒有紅色部分出現後便可Generate。


TBB_LIB_DIRTBB_STDDEF_PATH也是一樣設置其所在路徑,再次Configure。


完成後打開opencv_cuda資料夾中的OpenCV.sln,並對其中的ALL_BUILDINSTALL專案按右鍵→建置(Build)
(記得把組態管理員設定Debug及Release各建置一次)



此時可能會發現一些問題:
警告: 檔案含有無法在目前字碼頁 (number) 中表示的字元。請以 Unicode 格式儲存檔案以防止資料遺失。

此處參考該篇文章來解決:
VC++ warning C4819 的解決方法

把那些發出警告的檔案以Unicode編碼存檔後再度建置一次...

大功告成!

p.s 編譯完的成果位在opencv_cuda\install資料夾內。

2 則留言:

  1. 你好,我最近也在研究OPENCV與GPU,照您的步驟實作了一番,有一些問題請您指教
    我用VC2012到最後完成編譯時,有太多太多的worming c4819來自於CUDA本來的程式碼,這些數以千計的程式碼真的都要打開來再用UNICODE儲存?另一方面,關於OPENCV的系統環境變數是要設定原始的來源目錄還是CMAKE編譯過後的OPENCV目錄?我看了一些文章是用來源目錄,那這樣CMAKE編譯不就沒意義了。因為我最後必須搭配PCL LIBRARY,所以更換為VC2010,依舊會有一些問題與VC2012相同。如果說我按照您的方式進行完畢後,要開始寫程式,我應該是開啟一個新專案後,將OPENCV.SLN的組態貼上,還是有其他的方式會更加容易工作?謝謝您的指教

    回覆刪除
    回覆
    1. 你好,關於warning C4819的問題
      一份code裡通常會出現很多次warning
      我編譯時出現warning的大約只有10來份code
      因此我就直接把它們全打開來存成unicode了
      從VS2012下面的錯誤清單找出這些檔案打開應該不難
      過程是有點繁瑣沒錯。

      至於OpenCV的系統環境變數
      如果你確定你編譯過後的OpenCV library完全可以使用
      那就可以考慮把它們放到一個固定的位置
      然後在系統環境變數path裡加入這個路徑
      那麼你之後開專案就只要添加include、lib目錄和其它相依性即可。

      另一個方法則是把你編譯過後的opencv目錄丟到你的專案資料夾裡
      然後在專案裡的那些屬性添加你編譯的opencv目錄的路徑和其它相依性等等
      最後,與上面方法的差別是──
      你還得把編譯後的opencv dll檔丟到你的程式所在的資料夾(如Debug)
      如此才能正確運行。

      刪除