# Opencv 4.5.0 & darknet install Windows
## 系統
* 請先確認顯卡的型號與驅動,請依照驅動安裝相對應的 CUDA 、 CUDNN (教學:[連結]( !https://medium.com/ching-i/win10-%E5%AE%89%E8%A3%9D-cuda-cudnn-%E6%95%99%E5%AD%B8-c617b3b76deb) )
* 在 cmd 裡面使用 `nvcc -V` 確認版本

* 請下載 [cmake-gui](https://cmake.org/download/)並安裝 ,方便之後 compile 使用
* 請下載 [Visual studio](https://visualstudio.microsoft.com/zh-hant/downloads/),這裡使用的版本是 Visual studio 2019
* 需要安裝 python,安裝的時候,需要選擇 "客製化安裝",並且勾選需要的選項 (如下圖)

## 安裝 opencv 、 opencv_contrib
* [opencv](https://github.com/opencv/opencv)
* [opencv_contrib](https://github.com/opencv/opencv_contrib)
透過 `tags` 來選擇下載的版本,這裡以 Opencv 4.5.0 做示範

* 下載之後解壓縮

### 安裝步驟
* 請到 opencv-4.5.0 的資料夾下,建立一個叫 `build` 的資料夾
* 打開 cmake-gui,輸入 source code 與 build 資料夾的路徑

* 點擊 configuration,會出現 compiler 的選項,請選擇正確的編譯器,因為我的 VS為2019 的版本,所以我這裡選 VS2019

* 第一次 compile 會出現錯誤,主要是因為裡面有一些設定需要做的
* CMAKE_INSTALL_PREFIX:Compile 結束後存放 libraries 的路徑

* OPENCV_ERTRA_MODULE :使用 Opencv_contrib 提供的 modules

* OPENCV_ENABLE_NONFREE:設定為 True

* 要使用 GPU 以下參數要設定為 True

* 將 BUILD_opencv_world:設定為 True

* 設定好之後,再按一次 Configuration,如果沒有錯誤,會出現 Configration Done!!

* 接下來按 Generator,Generator 成功會出現 Generator Done

* 點 Open Project,打 VS 2019 進行編譯

* 請確認這裡的組態的模式,將其改為 Release

* 在方案總管裡面找到 Cmake_target -> ALL_BUILD 點選右鍵 -> 建置

(*建置方案需要一點時間,請耐心等待* )
* 找到 Cmake_target -> INSTALL 點選右鍵 -> 建置

* 編譯完之後會在 `CMAKE_INSTALL_PREFIX` 的路徑下產出下圖的檔案

* 將 x64 -> bin 與 bin 加進環境變數裡面
### 測試Opencv
#### python
* 打開 cmd 輸入 `python`,`import cv2`,若是有 import 成功,以及輸出正確版本,就表示安裝成功

#### C++
* 新建一個項目test,並在源文件中添加一個cpp文件,比如:main.cpp;
* 打開project -> test Properties
* 通用屬性 -> C/C++目錄 ->包含目錄中添加
D:\opencv4.5.0\opencv-4.5.0\build\install\include

* 連結器 -> 其他程式庫目錄
D:\opencv4.5.0\opencv-4.5.0\build\install\x64\vc16\lib

* 連結器 -> 輸入 -> 其他相依性
D:\opencv4.5.0\opencv-4.5.0\build\install\x64\vc16\lib 裡面的 lib 輸入
*可以寫一個 bat 檔,讓他讀取路徑裡面的檔名*
`@echo off
dir *.lib /b /on >list.txt`

* 把 VS 重開,並且執行下段程式,執行成功就代表 OpenCV 安裝成功
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
int main()
{
std::string image_path = samples::findFile("starry_night.jpg");
Mat img = imread(image_path, IMREAD_COLOR);
if (img.empty())
{
std::cout << "Could not read the image: " << image_path << std::endl;
return 1;
}
imshow("Display window", img);
int k = waitKey(0); // Wait for a keystroke in the window
if (k == 's')
{
imwrite("starry_night.png", img);
}
return 0;
}
## 安裝 darknet
### 前置作業
* 將 `C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\extras\visual_studio_integration\MSBuildExtensions` 下有關 CUDA 的四個檔案

複製到 `C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations` 與 `C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140`,如果沒有複製在編譯時可能會找不到 CUDA
* 請先到 Github 官網下載 [darknet](https://codeload.github.com/AlexeyAB/darknet/zip/master) 原始碼
* 將先前編譯好的 OpenCV 下 `\build\install\x64\vc16\bin` 的兩個 dll 檔案複製到 `darknet-master\build\darknet\x64`

* 打開 Cmake-GUI ,設定 darknet 的路徑 -> 按下 Configuration

* 選擇編譯器,我使用的是 VS2019

* 修改以下參數,再按下 Configuration,正確無誤之後會出現 Configuration Done

* 按下 Generator,無誤會出現 Generator Done
* 到 `darknet-master\build\darknet\` 的路徑下,打開 darknet.sln。若無GPU,則打開 darknet_no_gpu.sln
* 打開之後,請確認組態為 `Release`、`x64`

* 選擇 `ALL_BUILD` -> 右鍵選擇建置

* 選擇 `INSTALL` -> 右鍵選擇建置

* 建置沒有錯誤就完成了!
### 測試 Darknet
* 因為是用 `Release` 編譯,所以將 Release 資料夾裡面的東西複製到 x64 的資料夾

* 打開 cmd 切換到 `darknet\build\darknet\x64` 下,並且執行 `darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output data/dog.jpg`,如果有建置成功,就會出現下圖。

---
**Trouble shooting**
- 在安裝 VS ,如果遇到 SDK 裝不起來,回傳的 error code 是 1303
- win+R -> regedit -> `Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots` 修改安裝路徑。
- VS2019 在編譯 OpenCV 時,出現 setlocal 的 error,請利用管理員的權限將 `build\OpenCV.sln` 專案開啟