# Install OpenCV
Date: 2023/05/07
## Outline
- [Install方法の種類](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#Install%E6%96%B9%E6%B3%95%E3%81%AE%E7%A8%AE%E9%A1%9E)
- [apt install](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#apt-install)
- [Build OpenCV from source(CUDAなし)](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#Build-OpenCV-from-sourceCUDA%E3%81%AA%E3%81%97)
- [Build OpenCV from source(CUDAあり)](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#Build-OpenCV-from-sourceCUDA%E3%81%82%E3%82%8A)
- [version2などかなり古い場合](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#version2%E3%81%AA%E3%81%A9%E3%81%8B%E3%81%AA%E3%82%8A%E5%8F%A4%E3%81%84%E5%A0%B4%E5%90%88)
- [Uninstall](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#Uninstall)
- [よくあるつまずきや確認すること](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8D%E3%82%84%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8)
- [OpenCV用sample code](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#OpenCV%E7%94%A8sample-code)
- [補足](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#%E8%A3%9C%E8%B6%B3)
- [Reference](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#Reference)
## Install方法の種類
|種類|CUDA(GPU)|特徴|
|----|:-------:|----|
|[apt install](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV/edit#apt-install)| |コマンド一つでインストールできる.バージョンはOSバージョンに依存|
|[Build OpenCV from source](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV/edit#Build-OpenCV-from-sourceCUDA%E3%81%AA%E3%81%97)| |最新や古いバージョンなどバージョン指定してインストールできる.|
|[Build OpenCV from source](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV/edit#Build-OpenCV-from-sourceCUDA%E3%81%82%E3%82%8A)| ✅ |無印のビルド版に加え,CUDAによる処理の高速化ができる.(Python対応)|
|[version2などかなり古い場合](https://kobe-kosen-robotics.org:10445/projects/kobe_kosen_robotics/wiki/Install_OpenCV#version2%E3%81%AA%E3%81%A9%E3%81%8B%E3%81%AA%E3%82%8A%E5%8F%A4%E3%81%84%E5%A0%B4%E5%90%88)||かなり古い場合はcontribなどがない|
リリースされたバージョンは https://opencv.org/releases/ で確認できる
## apt install
以下のコマンドを実行するのみ
```{note}
インストールされるバージョンは 4.5.4(Ubuntu22.04の場合)
```
```bash
$ sudo apt update
$ sudo apt install -y apt install libopencv-dev
```
## Build OpenCV from source(CUDAなし)
例として,version : 4.7.0 をインストールする(各自,任意のバージョンに変更)
ビルドはNinjaとMakeの2通りある.NinjaがMakeの上位互換とされている
Ninjaによるビルド
```bash
# Install minimal prerequisites (Ubuntu 18.04 as reference)
$ sudo apt update
$ sudo apt install -y cmake g++ build-essential vim git wget unzip ninja-build
$ sudo apt install -y libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libgtkglext1 libgtkglext1-dev libcanberra-gtk-module
# Download and unpack sources
$ mkdir opencv_build && cd opencv_build
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.7.0.zip # version指定
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.7.0.zip # version指定
$ unzip opencv.zip
$ unzip opencv_contrib.zip
# Create build directory and switch into it
$ mkdir build && cd build
# Configure
$ cmake -GNinja -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.7.0/modules ../opencv-4.7.0 # version指定(PATH指定)
# Build
$ cmake --build .
# Install(By default OpenCV will be installed to the /usr/local. So, sudo be should required)
$ sudo ninja install
# Install Check
$ opencv_version
4.7.0
```
Makeによるビルド
```bash
# Install minimal prerequisites (Ubuntu 18.04 as reference)
ninja-buildのインストールする必要なし
# Download and unpack sources
Ninja版と同じ
# Create build directory and switch into it
Ninja版と同じ
# Configure
$ cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.7.0/modules ../opencv-4.7.0 # Makeを使う場合,'-GNinja' は必要ない
# Build
$ cmake --build . -- -jx # Makeを使う場合,並列処理用のjobを指定する.(x = CPU core + 1)が一番高速らしい
# 補足:--の後につけたオプションが makeコマンドに渡される
# Install(By default OpenCV will be installed to the /usr/local. So, sudo be should required)
$ sudo make install
# Install Check
$ opencv_version
4.7.0
```
## Build OpenCV from source(CUDAあり)
前提要件:cuda,cuDNNがインストールされていること.確認は `$ nvcc -V` , `$ dpkg -l | grep "cudnn"` でできる.(していない場合,nvidia-smiが実行できるようにNvidia-driverやcudaをインストールする)
```{note}
`$ nvidia-smi`で表示されるCUDA versionはドライバーが対応している最大のバージョンであり,インストールされているバージョンではない!
```
CUDA版OpenCVは導入難易度マックスである.cmakeやnvidia driver,cudaバージョンなどの前提知識を持つ者でも苦戦するであろう.
特に,[OpenCV完全体](https://qiita.com/fukushima1981/items/fae7d40123bfdf426624)(すべての機能有効化や外部ライブラリインストールした究極形態)のコンパイルは非常に難しい..
環境
- OS: Ubuntu22.04
- CPU: Ryzen9 5900X
- GPU: Nvidia GeForce RTX 3080
- Docker image: nvidia/cuda12.1.1-cudnn8-devel-ubuntu20.04
- Python3.8.10
- OpenCV: 4.7.0
- Nvidia
- driver: 530.41.03
- cuda: 12.1.1
- cuDNN: 8.9.0
- build: Ninja
Install dependent packages
```bash
$ sudo apt update
$ sudo apt install -y cmake g++ build-essential vim git wget unzip ninja-build python3 python3-pip
$ python3 -m pip install numpy
$ sudo apt install -y libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 \
libtbb-dev libjpeg-dev libpng-dev libtiff-dev libgtkglext1 libgtkglext1-dev libcanberra-gtk-module
```
Download and unpack sources
```bash
$ mkdir opencv_build && cd opencv_build
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.7.0.zip # version指定
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.7.0.zip # version指定
$ unzip opencv.zip
$ unzip opencv_contrib.zip
```
Create build directory and switch into it
```bash
$ mkdir build && cd build
```
Configure
多くのオプションがあるが,ネットに複数記載されているものを抜粋した
`-D CUDA_ARCH_BIN`には,GeForce RTX 3080 の Compute Capability を指定
指定する番号はNvidia公式ページ[CUDA GPUs - Compute Capability](https://developer.nvidia.com/cuda-gpus)からアクセス
```bash
$ cmake -G Ninja \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.7.0/modules \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_DNN_CUDA=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON .. \
-D BUILD_opencv_cudaimgproc=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D WITH_GSTREAMER=ON \
-D WITH_OPENGL=ON \
-D WITH_PYTHON=ON \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D PYTHON_DEFAULT_EXECUTABLE=python3 \
-D ENABLE_FAST_MATH=ON \
-D CUDA_ARCH_BIN="8.6" \
-D CUDA_FAST_MATH=ON \
../opencv-4.7.0 # version指定(PATH指定)
以下のように出力されればOK
違う場合,どこかでerrorが出ているので修正
-- Configuring done
-- Generating done
-- Build files have been written to: /home/opencv_build/build
```
Build
```bash
$ cmake --build .
```
Install(By default OpenCV will be installed to the /usr/local. So, sudo be should required)
```bash
sudo ninja install
```
Install Check
```bash
$ opencv_version
4.7.0
```
Pythonでimportできるように .so を dist-packages へシンボリックリンクを作成(複製してもいい)
.soとdist-packagesのPATHは,Configureの最後に出てきたリストの以下を参照
(C++のサンプルプログラムでも出力される)
>```log
> -- Python 3:
> -- Interpreter: /usr/bin/python3 (ver 3.8.10)
> -- Libraries: /usr/lib/x86_64-linux-gnu/libpython3.8.so (ver 3.8.10)
> -- numpy: /usr/local/lib/python3.8/dist-packages/numpy/core/include (ver 1.24.3)
> -- install path: lib/python3.8/site-packages/cv2/python-3.8
> --
> -- Python (for build): python3
> --
> -- Java:
> -- ant: NO
> -- JNI: NO
> -- Java wrappers: NO
> -- Java tests: NO
> --
> -- Install to: /usr/local
> -- -----------------------------------------------------------------
> --
> -- Configuring done
> -- Generating done
> -- Build files have been written to: /home/opencv_build/build
>```
```bash
$ ln -s /usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so /usr/local/lib/python3.8/dist-packages/cv2.so
$ python3 -c "import cv2; print(cv2.__version__)"
```
生成されたサンプルたちは, `/usr/local/share/opencv4/samples/` 以下にある
GPUを用いたサンプルなどがあるので実行してみてもいいかもしれない
## version2などかなり古い場合
例として,version : 2.4.13.6 をインストールする(各自,任意のバージョンに変更)
Makeでのビルドは Build OpenCV from source(CUDAなし)のMakeによるビルドを参考に
Ninjaによるビルド
```bash
# Install minimal prerequisites (Ubuntu 18.04 as reference)
$ sudo apt update
$ sudo apt install -y cmake g++ build-essential vim git wget unzip ninja-build
$ sudo apt install -y libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 \
libtbb-dev libjpeg-dev libpng-dev libtiff-dev libgtkglext1 libgtkglext1-dev libcanberra-gtk-module
# Download and unpack sources
$ mkdir opencv_build && cd opencv_build
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/2.4.13.6.zip # version指定
$ unzip opencv.zip
# error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declaredなどのエラー対策(このバージョンで出た事例)
$ vi opencv-2.4.13.6/modules/highgui/src/cap_ffmpeg_impl.hpp
# cap_ffmpeg_impl.hppに不足している以下3つの定義を追加する
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
# Create build directory and switch into it
$ mkdir build && cd build
# Configure
$ cmake -GNinja ../opencv-2.4.13.6 # version指定(PATH指定)
# Build
$ cmake --build .
# Install(By default OpenCV will be installed to the /usr/local. So, sudo be should required)
sudo ninja install
Install Check
$ opencv_version
2.4.13.6
```
CUDAに対応させる場合:
cmakeで以下のようなエラーが出る
> CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
> Please set them or make sure they are set and tested correctly in the CMake files:
> opencv_dep_CUDA_nppi_LIBRARY
> linked by target "opencv_test_core" in directory /root/opencv_build/opencv-2.4.13.6/modules/core
> linked by target "opencv_test_core" in directory /root/opencv_build/opencv-2.4.13.6/mod
このサイトが役に立つ?かもしれない
https://stackoverflow.com/questions/46584000/cmake-error-variables-are-set-to-notfound
## Uninstall
apt installの場合:
```bash
$ sudo apt purge libopencv-dev
```
ソースをビルドした場合:
```bash
# cmake などを実行したbuild ディレクトリに移動しておくこと
$ ninja uninstall # Makeを使用した場合 `make uninstall`
```
## よくあるつまずきや確認すること
1.cmakeコマンドを実行後,出力に done と出たら成功
それ以外はerrorが出ている
``` bash
$ cmake -GNinja -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.7.0/modules ../opencv-4.7.0
-- Configuring done
-- Generating done
-- Build files have been written to: /...../opencv_build/opencv/build
```
2.意図しないcudaの対応版インストール
cudaがインストールされている場合,勝手にcmakeでcudaが検出される
cudaなしでインストールしたい場合は,`-D WITH_CUDA=OFF` をオプションに追加する
## OpenCV用sample code
C++
> main.cpp
> ```c++
> #include
>
> int main(int argc, char** argv) {
>
> printf("OpenCV: %s", cv::getBuildInformation().c_str());
>
> if ( argc != 2 )
> {
> printf("usage: DisplayImage.out \n");
> return -1;
> }
>
> cv::Mat img = cv::imread(argv[1], -1);
> if(img.empty())
> {
> printf("error: Can not found %s", argv[1]);
> return -1;
> }
>
> cv::namedWindow("Example", cv::WINDOW_AUTOSIZE);
> cv::imshow("Example", img);
> cv::waitKey(0);
> cv::destroyWindow("Example");
> return 0;
> }
> ```
> CMakeLists.txt
> ```txt
> cmake_minimum_required(VERSION 3.1)
> project( DisplayImage )
> find_package( OpenCV REQUIRED )
> add_executable( DisplayImage main.cpp )
> target_link_libraries( DisplayImage ${OpenCV_LIBS} )
> ```
> build command (Please prepare test.png in your build folder)
> ```bash
> $ mkdir build && cd build
> $ cmake -GNinja .. # Makeを使う場合は,-GNinjaを消す
> $ cmake --build . # Ninjaを使う場合は 'ninja',Makeを使う場合は `make` でも可能
> $ ./DisplayImage [表示する画像のPATH]
> ```
Python
>```python
> import numpy as np
> import cv2 as cv
> import time
>
> npTmp = np.random.random((1024, 1024)).astype(np.float32)
>
> npMat1 = np.stack([npTmp,npTmp],axis=2)
> npMat2 = npMat1
>
> cuMat1 = cv.cuda_GpuMat()
> cuMat2 = cv.cuda_GpuMat()
> cuMat1.upload(npMat1)
> cuMat2.upload(npMat2)
>
> start_time = time.time()
> cv.cuda.gemm(cuMat1, cuMat2,1,None,0,None,1)
>
> print("CUDA using GPU --- %s seconds ---" % (time.time() - start_time))
>
> start_time = time.time()
> cv.gemm(npMat1,npMat2,1,None,0,None,1)
>
> print("CPU --- %s seconds ---" % (time.time() - start_time))
>```
## 補足
依存パッケージは最低限しか記載していない
ネットにはこれをインストールしろとたっくさん書いてるので一例を書いておく
なんか,足りないとかのエラーが出たら実行してみるといい
```bash
# https://linuxize.com/post/how-to-install-opencv-on-ubuntu-20-04/
$ sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
gfortran openexr libatlas-base-dev python3-dev python3-numpy \
libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \
libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
# https://qiita.com/modu01/items/6d72a0dfcbfdffee5f15
$ sudo apt-get -y install cmake libjpeg62 libjpeg62-dev libgtk2.0-0 \
libgtk2.0-dev libpng-dev libtiff5-dev libtiff-dev libunicap2 \
libunicap2-dev libswscale-dev libavformat-dev libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev libcanberra-gtk-module
# https://qiita.com/gusugusu1018/items/2115343a8adce378ff4a
$ sudo apt install -y gcc-6 g++-6 cmake build-essential git pkg-config ccache \
unzip ecm extra-cmake-modules fcitx-libs-dev libfcitx-qt5-1 \
mesa-utils libgtk2.0-dev libgtk-3-dev ffmpeg \
libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev \
libjpeg-dev libpng-dev libtiff5-dev x264 libxvidcore-dev yasm \
libxine2-dev libv4l-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev \
libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev \
x264 v4l-utils ffmpeg libdc1394-22 libdc1394-22-dev libtiff5-dev \
qt5-default libeigen3-dev libeigen3-doc tesseract-ocr tesseract-ocr-jpn \
vtk6 tcl-vtk6 python-vtk6 libgflags-dev autoconf automake libtool \
autoconf-archive libleptonica-dev libtesseract-dev gphoto2 liblapacke-dev \
libgoogle-glog-dev libprotobuf-dev libprotoc-dev protobuf-compiler \
libgphoto2-dev libvtk6-dev libvtk6-qt-dev liblapack-dev libatlas-base-dev \
gstreamer1.0
```
## Reference
apt
1. [OpenCV を C++ から扱うためのサンプルコード](https://www.qoosky.io/techs/ad1e4deb05)
normal
1. [Installation in Linux](https://docs.opencv.org/4.7.0/d7/d9f/tutorial_linux_install.html)
2. [(CMake)WSLに公式OpenCVをやさしくインストール (C/C++, Python2, Python3)](https://qiita.com/kekenonono/items/031a3b41d6adb4c3e876)
3. [cmake経由でmake実行時に-jオプションを渡す(未解決)→makeからninjaに乗る変える回](https://yuyubu-sub.hateblo.jp/entry/2019/11/11/cmake-option)
4. [Set the number of threads in a CMake build](https://stackoverflow.com/questions/36633074/set-the-number-of-threads-in-a-cmake-build)
5. [Ninjaの速さを体感するともはやMakeには戻れない](https://qiita.com/shohirose/items/a1e2fcb1ea25fb4e7644)
6. [(CMake)WSLに公式OpenCVをやさしくインストール (C/C++, Python2, Python3)](https://qiita.com/kekenonono/items/031a3b41d6adb4c3e876)
cuda
1. [OpenCVの画像処理をGPU(CUDA)で高速化する](https://qiita.com/iwatake2222/items/dd7ea3efe65ac77bf783)
2. [CUDAありのOpenCVをbuildしたった(Ubuntu18.04)](https://qiita.com/satsukiya/items/7d5a5e66bb361667f882)
3. [【保存版】OpenCV Python with CUDAをAnaconda環境にインストールするレシピ](https://qiita.com/y-vectorfield/items/d6db3c1022fc76e7fda7#opencv-python-with-cuda%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E6%BA%96%E5%82%99)
4. [Install OpenCV 4.5.1 with CUDA 11.1 in Ubuntu 20.04 LTS](https://gahan9.medium.com/install-opencv-4-5-1-with-cuda-11-1-in-ubuntu-20-04-lts-4af667287d9d)
5. [Ubuntu18.04でOpenCV3.4のほぼ完全体をbuildした](https://qiita.com/gusugusu1018/items/2115343a8adce378ff4a)
6. [AWS EC2でDeepStreamやCUDA対応のOpenCVを利用する方法](https://dream-soft.mydns.jp/blog/developper/smarthome/2021/01/2772/)
old
1. [OpenCV 2.4.13.7 documentation Installation in Linux](https://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html?highlight=install)