アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

【Windows】C++知識なしから始めるOpenCVのビルドから使用まで

※プロダクトとかではなくとりあえず動けばいい人用

やること

  • cuda入りのOpenCVのビルド
  • Javaでの使用(ついで)
  • CLionでC++での使用

ダウンロード

注意

OpenCVとmodulesは同じバージョンにしてください。
Problem compiling opencv_contrib/modules/cudaimgproc/src/cuda/clahe.cu(128): error: identifier "PtrStepus" is undefined · Issue #13984 · opencv/opencv · GitHub

CMake

とりあえず設定したらConfigureします。新しい設定とか出てきます。

現時点では2019ではビルドできませんでした。最新版でビルドできなかった時は古いバージョンを使ってみましょう。
x64なのでそれを明示します。
CMake Settings

「PENCV_EXTRA_MODULES_PATH」を設定します。バックスラッシュではなくスラッシュを使用しましょう。
PENCV_EXTRA_MODULES_PATH

Javaで使う

AntとJNIにパスを通します。
Configureして以下のように出力されたことを確認してください。

Java wrappers:               YES

Cudaを使う

Cudaのインストールはここでは省きます。
「WITH_CUDA」にチェックを付けます。
Configureすると「CUDA_ARCH_BIN」と「CUDA_ARCH_BIN」が出てくるので設定します。自分はRTX 2070なので10です。でもConfigureすると7.5に書き換えられるのでそこまで対応されてないって感じなのでしょうか。とりあえず調べて自分のハードウェアに合ったものを入力しておけば間違いなさそうです。 「CUDA_ARCH_BIN」はTuringです。

最後

GenerateしてOpen Projectします。

ビルドする

OpenCVデバッグするわけじゃないしReleaseにするか、などとすしてハマった。
用途によってReleaseとDebugを使い分けましょう。
Releaseを使うなら全ての場所でReleaseに統一、Debugを使うならすべての場所でDebugで統一すればハマらないでしょう。
Release

INSTALLを右クリックしてビルドします。
Build

intel-8700Kを使っていますが30分以上かかりました。長い。
完了するとinstallディレクトリが作成され、以下に成果物があります。

使用する

Windowsのシステム環境変数の編集から「install\x64\vc15\bin」にPathを通します。

C++

CLionでやります。
C++のプロジェクトを作ってください。
CLion

CMakeLists.txtとmain.cppがあるはずです。

CMakeLists.txtの設定

「/path/to/install/」だけ適切なのにすれば動くはず。
「/path/to/なんとか」は適切なパスに自分で設定しろって事です。よく出てくるので覚えておきましょう。

# project settings
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 14)
project(opencv_sample)

# setup opencv
set(OpenCV_DIR "path/to/install/")
find_package(OpenCV REQUIRED)

# build
add_executable(opencv_sample main.cpp)
# link OpenCV
target_link_libraries(opencv_sample ${OpenCV_LIBS})

OpenCVのビルドでReleaseにした人は以下を追加します。

set(CMAKE_BUILD_TYPE Release)

DebugかReleaseかで読み込むlibファイル(末尾がd.lib)変えてるのかなぁ。ちょっとここわからない。

cudaのテストは以下を使えば良いのでは。

cv::cuda::threshold

Java

IDEIntelliJを使いました。ビルドにはgradleを使用します。
以下を追加すれば動きます。

build.gradle

dependencies {
    compile files('path/to/install/java/opencv-346.jar')
}

tasks.withType(JavaExec) {
    systemProperty "java.library.path", file("path/to/install/x64/vc15/lib")
}

おわり

色々な所にハマって疲れた。
Visual Studioでのセットアップも書こうとしたけどよく分からなかった。
書いたビルド設定が読みにくいXMLの中に入るのが微妙なんだよな。