Install OpenCV#
Date: 2023/05/07
Outline#
Install方法の種類#
種類 |
CUDA(GPU) |
特徴 |
---|---|---|
コマンド一つでインストールできる.バージョンはOSバージョンに依存 |
||
最新や古いバージョンなどバージョン指定してインストールできる. |
||
✅ |
無印のビルド版に加え,CUDAによる処理の高速化ができる.(Python対応) |
|
かなり古い場合は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
normal
cuda
old