Install OpenCV#

Date: 2023/05/07

Outline#

Install方法の種類#

種類

CUDA(GPU)

特徴

apt install

コマンド一つでインストールできる.バージョンはOSバージョンに依存

Build OpenCV from source

最新や古いバージョンなどバージョン指定してインストールできる.

Build OpenCV from source

無印のビルド版に加え,CUDAによる処理の高速化ができる.(Python対応)

version2などかなり古い場合

かなり古い場合はcontribなどがない

リリースされたバージョンは https://opencv.org/releases/ で確認できる

apt install#

以下のコマンドを実行するのみ

注釈

インストールされるバージョンは 4.5.4(Ubuntu22.04の場合)

$ 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によるビルド

# 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によるビルド

# 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をインストールする)

注釈

$ nvidia-smiで表示されるCUDA versionはドライバーが対応している最大のバージョンであり,インストールされているバージョンではない!

CUDA版OpenCVは導入難易度マックスである.cmakeやnvidia driver,cudaバージョンなどの前提知識を持つ者でも苦戦するであろう. 特に,OpenCV完全体(すべての機能有効化や外部ライブラリインストールした究極形態)のコンパイルは非常に難しい..
環境

  • 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

$ 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

$ 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
  多くのオプションがあるが,ネットに複数記載されているものを抜粋した
  -D CUDA_ARCH_BINには,GeForce RTX 3080 の Compute Capability を指定
  指定する番号はNvidia公式ページCUDA GPUs - Compute Capabilityからアクセス

$ 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

$ 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

Pythonでimportできるように .so を dist-packages へシンボリックリンクを作成(複製してもいい)
.soとdist-packagesのPATHは,Configureの最後に出てきたリストの以下を参照
(C++のサンプルプログラムでも出力される)

--   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
$ 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によるビルド

# 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の場合:

$ sudo apt purge libopencv-dev

ソースをビルドした場合:

# cmake などを実行したbuild ディレクトリに移動しておくこと
$ ninja uninstall    # Makeを使用した場合 `make uninstall`

よくあるつまずきや確認すること#

1.cmakeコマンドを実行後,出力に done と出たら成功   それ以外はerrorが出ている

$ 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

#include <opencv2/opencv.hpp>

int main(int argc, char** argv) {
    
    printf("OpenCV: %s", cv::getBuildInformation().c_str());

    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\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

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)

$ mkdir build && cd build
$ cmake -GNinja ..    # Makeを使う場合は,-GNinjaを消す
$ cmake --build .     # Ninjaを使う場合は 'ninja',Makeを使う場合は `make` でも可能
$ ./DisplayImage [表示する画像のPATH]

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))

補足#

依存パッケージは最低限しか記載していない ネットにはこれをインストールしろとたっくさん書いてるので一例を書いておく なんか,足りないとかのエラーが出たら実行してみるといい

# 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++ から扱うためのサンプルコード

normal

  1. Installation in Linux

  2. (CMake)WSLに公式OpenCVをやさしくインストール (C/C++, Python2, Python3)

  3. cmake経由でmake実行時に-jオプションを渡す(未解決)→makeからninjaに乗る変える回

  4. Set the number of threads in a CMake build

  5. Ninjaの速さを体感するともはやMakeには戻れない

  6. (CMake)WSLに公式OpenCVをやさしくインストール (C/C++, Python2, Python3)

cuda

  1. OpenCVの画像処理をGPU(CUDA)で高速化する

  2. CUDAありのOpenCVをbuildしたった(Ubuntu18.04)

  3. 【保存版】OpenCV Python with CUDAをAnaconda環境にインストールするレシピ

  4. Install OpenCV 4.5.1 with CUDA 11.1 in Ubuntu 20.04 LTS

  5. Ubuntu18.04でOpenCV3.4のほぼ完全体をbuildした

  6. AWS EC2でDeepStreamやCUDA対応のOpenCVを利用する方法

old

  1. OpenCV 2.4.13.7 documentation Installation in Linux