OpenCV4.10をビルドしてVisualStudio2022 C++で使えるようにする

## 20241212追記
長々とだらだらと書きましたが公式のチュートリアルが丁寧でした。
公式をちゃんと見ないとだめですね。反省

https://docs.opencv.org/4.x/dd/d6e/tutorial_windows_visual_studio_opencv.html

## OpenCV4.10をビルドしてVisualStudio2022 C++で使えるようにする！
~~大事なことなので2回書きました~~
前回書いたこちらの続きになります。

https://qiita.com/calcMCalcm/items/00fe171bddd9ded86019

> ONNX RUNTIME、OPENCVをビルドしたのは、C++で利用できるようするためです。

C++は私にとって未踏の地なので、自分で理由をつけて逃れていましたが、できる/できない の判断を先延ばしにしているだけなので、~~イヤイヤながら~~ 着手し始めてみました。

まずは単純にOpenCVを使ったプログラムが動けばいい、と思ったのですが、素人の私に思っていたより大変だったので、まとめておくものです。

## 環境
Windows11
ONNX RUNTIME 1.21.0
CUDA 12.4
cuDNN 9.1
OPENCV 4.10
VisualStudio 2022 Version 17.12.3 （なんかちょびっと上がってました
CMAKE 3.31.1

## 参考にした記事
大まかな流れ的には下の記事を参考にさせて頂きました！

https://qiita.com/hatahasa83/items/0ad13e79e83be274ca73

https://qiita.com/h-adachi/items/aad3401b8900438b2acd

https://qiita.com/msmania/items/588d295262b3eea831d9

https://www.kkaneko.jp/tools/win/windows_opencv.html

## CMake GuiでConfigure,Generateする！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/2a2f1cf1-247e-3372-8174-8e4c3f955020.png)

OpenCV、opencv_contribをGit cloneなどで落としてきた後、Cmake GUIでConfigure、Generateします。
Cmake GUIの画面で、使いたい機能をちゃんと設定することがほんと大切です。
CUDA、ONNXを利用したい私は次のように設定しました。
- `WITH_CUDA`：:white_check_mark:
- `OPENCV_DNN_CUDA`：:white_check_mark:
- `CUDA_ARCH_BIN`：`7.5;8.0;8.6;8.9;9.0`
- `CUDA_ARCH_PTX`：`7.5;8.0;8.6;8.9;9.0`
- `CUDA_TOOLKIT_ROOT_DIR`：`C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.4`
- `WITH_CUDNN`：:white_check_mark:
- `WITH_ONNX`：:white_check_mark:
- `ONNXRT_ROOT_DIR`：`C:/Program Files/onnxruntime`
- `BUILD_opencv_world`：:white_check_mark:
:::note info
これくらい設定すると、Configureを押すと、あとはCMAKEがいい感じで設定してくれたりします。
変わった赤のところを確認し、もし違ってそうなら書き直す、くらいの感じで大丈夫です。
:::
:::note warn
CUDA_ARCH_BIN、CUDA_ARCH_PTXは、私が対象とする世代カードを設定しています。デフォルトだと全部対象だったと思います。
:::
:::note alert
使う予定もツールキットも持ってないけど「俺欲しいからいれちゃおうー♪」と入れると、正しくビルドできずに動かなくなったりするので気を付けよう！
（OpenVINOにチェックを入れて、ぱっと見は良さそうだったけど結局なんか動かなくてビルドしなおした回数１）
:::
:::note alert
BUILD_opencv_world：:white_check_mark: ←これ大事なので忘れないように！
（チェックを入れてなくて結局動かなくてビルドしなおした回数１）
:::

設定が良さそうならGenerateをポチ！
Generateが終わると、Open Projectが押せるので、押す。とVisualStudio2022が起動する。

## VisualStudio2022でビルドする！
次の順番でビルドを行います。
1. ビルド＞ビルド＞0 ALL_BUILD　（１～１．５時間くらい？）
1. ビルド＞ビルド＞2 INSTALL　（まぁ早い）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/c375bd82-72aa-7852-58b3-d69a1af0e839.png)
（1 CLEAN_CUDA_DEPENDSはよくわからなかったので、とりあえずやってません・・・
→やってみました。1 自体は数秒で終わります。対象外のCUDA関係が削除されるのかな？その後２を実行するとcuda周りのビルドが行われます。０→２でも使用上問題なさそうですが、元の設定どおりにするには、０，１，２と順に実行するのがいいのかもしれませんね。）
 
INSTALLを行うと、installというフォルダに必要なファイルがまとめられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/73629e72-c1c9-e6a2-514a-fe83592b564b.png)

## 環境変数を設定する！
具体的なパスはご自身の環境にあわせて設定してください。

システム ＞ システム詳細設定 ＞ 環境変数 ＞ システム環境変数のPathに追加します。
- `D:\opencv\install`
- `D:\opencv\install\x64\vc17\bin`
- `D:\opencv\install\x64\vc17\lib`
- `D:\opencv\install\bin`
- `D:\opencv\install\include`

システム ＞ システム詳細設定 ＞ 環境変数 ＞ システム環境変数にOPENCV_ROOTという項目を追加します。
- `OPENCV_ROOT` `D:\opencv`

:::note warn
環境変数設定後は、一度再起動をするようにしてください。
:::

## VisualStudioで新しい空のプロジェクトを作成する！
空のプロジェクト！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/27e36a84-f40a-ea9a-c266-47a77acbf5a5.png)

## VisualStudioのプロジェクトでOpenCVが使えるように設定をする！
構成：Release
- プロジェクト ＞ プロパティ ＞ VC++ディレクトリ ＞ 外部インクルードディレクトリ `D:\opencv\install\include;`
- プロジェクト ＞ プロパティ ＞ VC++ディレクトリ ＞ ライブラリディレクトリ
`D:\opencv\install\x64\vc17\lib;`
- プロジェクト ＞ プロパティ ＞ デバッグ ＞ 環境
`D:\opencv\install\x64\vc17\bin;`
- プロジェクト ＞ プロパティ ＞ リンカー ＞ 追加の依存ファイル
`opencv_world4100.lib;`

## VisualStudioでOPENCVのサンプルコードを追加して実行、確認する！
ソリューションエクスプローラーで右クリック ＞ 追加 ＞ 新しい項目 ＞ C++ファイル（.cpp）
して、次のコードをこぴぺ。

```c++:test.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
	Mat image = Mat::zeros(100, 100, CV_8UC3);
	imshow("", image);
	waitKey(0);
}

```
構成：Releaseで、緑の:arrow_forward:をぽち！
黒く塗りつぶした画像のウィンドウが出たらＯＫ！やったね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/87754bdb-d20f-967e-221f-14eb222e2ff9.png)

## その他、わたしがハマったポイント
- C#やVBのようなフォームありの共通言語ランタイム設定 CLRを有効にすると、cv::mutexがないみたいなエラーがでます。CLRは諦めましょう。
https://forum.opencv.org/t/compile-error-when-enable-clr-support-on-windows/18241

## 感想
まだONNXまでたどり着いていない・・・！
あとUIが不安でしかない。