OpenCVSharp GPU - eiichiromomma/CVMLAB GitHub Wiki

(OpenCVSharp) GPU

OpenCvSharpをGPU対応にする。

  • Visual Studio 2019
  • CUDA環境
  • CMake
  • vcpkg

が必要。

前準備

  • CMakeをインストールして,最後のPATHを通すというところはAll Usersかその下にしておく
  • vcpkgのソースをgit cloneなりzipでダウンロードするなり持ってきて,Quick Startの通り.batファイルをコマンドプロンプトなりPowerShellで実行すると必要なものを全部入れてくれる。
  • Visual Studio 2019(無料のでいい)を入れておく
    • C++
    • .Net 4.8 SDK
    • 英語言語パック

GPU対応版OpenCVのビルド

解説の内容に従って,まずopencv_filesをcloneし,build_windows.ps1ファイルを編集してGPUを有効にする。(使ってるGPUのCUDA ARCHに注意。具体的には自分の持ってるGPUのARCHより上は残す感じ。2.xとか誰も使わない。)

--- a/build_windows.ps1
+++ b/build_windows.ps1
@@ -42,6 +42,9 @@ function BuildForWindows($platform, $vcpkgPath, $runMsbuild) {
           -D BUILD_opencv_ts=OFF `
           -D BUILD_opencv_world=OFF `
           -D WITH_MSMF=${msmfFlag} `
+          -D WITH_CUDA=ON `
+          -D OPENCV_DNN_CUDA=ON `
+          -D CUDA_ARCH_BIN="6.1 7.0 7.5" `
           -D WITH_MSMF_DXVA=${msmfFlag} `
           -D WITH_QT=OFF `
           -D WITH_FREETYPE=OFF `
@@ -71,7 +74,7 @@ function BuildForWindows($platform, $vcpkgPath, $runMsbuild) {
 If ((Resolve-Path -Path $MyInvocation.InvocationName).ProviderPath -eq $MyInvocation.MyCommand.Path) {

   ##### Change here #####
-  $vcpkgPath = "C:\Tools\vcpkg"
+  $vcpkgPath = "vcpkgをcloneした場所"
   $platform = "x64"
   #$platform = "x86"

次に管理者権限でのPowerShell上でps1ファイルの実行の許可設定(ググろう)をRemoteSignedにしておく。 そして普通のPowerShellでbuild_windows.ps1を実行すると諸々良い感じにしてくれるのでbuild_win_x64のOpenCV.slnを開いてビルドする。

OpenCvSharpのビルド

git cloneでOpenCvSharpのソースを入手した後に,PowerShell上でdownload_opencv_windows.ps1とdownload_tesseract_windows.ps1を実行して標準的な関連ファイルをコピーしておく。これらのファイルの一部をさっきビルドしたファイルに関係するもので上書きする。

.lib関係

プロジェクトのプロパティを弄る美しい手段もあるが,ライブラリ一覧を列挙するのが面倒なので片っ端からopencvsharp/opencv_files/opencvXXX_win_64/x64/vc16/staticlibにコピーしておく。具体的には下記の.libファイル。

  • vcpkg\installed\x64-windows-static\lib
  • opencvsharp\tesseract_files\tesseract_vcpkg\installed\x64-windows-static\lib
  • opencv_files\build_win_x64\lib\Release
  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vXX.X\lib\x64

PowerShellでopencvsharp/opencv_files/opencvXXX_win_64/x64/vc16/staticlibに移動して

Get-ChildItem -Name *.lib

を実行して出てきた.libの一覧をOpenCvSharpExternプロジェクトのプロパティから,リンカの入力ファイル一覧に貼り付ける。微妙にopencvのlibも増えたりしているので一覧を取得して貼り付けるのが確実。同じくプロパティのリンカーの参照フォルダにopencvsharp/opencv_files/opencvXXX_win_64/x64/vc16/staticlibを加えておく。

dll関係

これも同じ感じで opencv_files\build_win_x64\bin\Release のopencv_videoio_ffmpeg453_64.dll をopencvsharp\opencv_files\opencv453_win_x64\x64\vc16\bin にコピーしておく。不要かも知れないがCUDAの C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vXX.X\bin から.dllファイルをコピーしておく

ビルド

x86とx64の両方をビルドする。x86の方は標準のファイルなのでコケることはない。x64でコケる場合はライブラリファイルの不足等が考えられるので,エラーメッセージで未解決の関数とかからライブラリを推定する。

NuGetのパッケージ作成

ビルドしただけだとsrc以下の各フォルダにdllが作られるだけだが,nugetフォルダのファイルを使ってパッケージを作れる。PowerShellで

.\nuget pack OpenCvSharp4.runtime.win.nuspec
.\nuget pack OpenCvSharp4.Windows.nuspec

の二つを実行する。二つのnuupkgファイルが出来てる筈なので,opencvsharp\nugetをVisual Studioのツール→オプション→NuGetパッケージマネージャー→パッケージソースで追加する。名前はOpenCvSharpとか付けておけば分かりやすい。 その後でアプリケーションのnugetパッケージを追加する際に,パッケージソースとして名付けたものを指定すると作ったパッケージをインストールできる。

アプリケーション

CUDAが有効になってるのはx64なので,AnyCPUではなくx64を新規作成してビルドしないと,win32のGPU無し版が使われることになるので注意。

もし上手くいっていないとコンソールにCPUに切り替えたと表示される。Formsの下のTextBoxのビルド情報でもGPUが有効になってるのが分かる。