LoginSignup
32

More than 3 years have passed since last update.

posted at

updated at

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

関連記事:やさしいWindows Subsystem for Linux (WSL) のインストール手順

はじめに

WSL(Windows Subsystem for Linux)のUbuntuに公式リリースのOpenCV4.1.2をmakeインストールしたので備忘録として残しておきます。

ターゲットとしてはOpenCVをC++で使いたい人向けです。
Python2, Python3でも使えるようにインストールしますが、Pythonだけで使いたい人はopencv-pythonを入れれば簡単らしいので。
また、途中に出てくるコマンドの説明なども可能な限りしていこうと思います。

OpenCVの公式ページ(Installation in Linux) を参考に進めていきます。

バージョン

今回作業した環境は以下の通りでした。参考までに。
Windows 10 Home Version 1809
Ubuntu 18.04.3 LTS
OpenCV4.1.2-dev
Python 2.7.15+
Python 3.6.8

概要

  • 1. パッケージのインストール
    • 1.1 必須のパッケージ
    • 1.2 Python-devとnumpy
    • 1.3 オプション
  • 2. OpenCVソースコードの入手
  • 3. CMakeによるmakefileの作成
  • 4. makeインストール
  • 5. 動作確認(バージョンの表示)
    • 5.1 Python2
    • 5.2 Python3
    • 5.3 C++
      • 5.3.1 cmakeを使ってビルド
      • 5.3.2 pkg-configを使ってビルド
  • 6. その他
  • 7. 参考

なお、4. の作業は待ち時間(30分程度)がかかりますので時間があるときに行ってください。

1. パッケージのインストール

公式ページ(Introduction to OpenCV)のRequired Packagesに該当する部分を実行していきます。
 

下記1.1から1.3まで一気にインストールしたい方はこちら
$ sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libvtk5-qt4-dev libqt4-dev libqt4-opengl-dev libgtkglext1 libgtkglext1-dev python-dev python-numpy python3-dev python3-numpy

1.1 必須のパッケージ

とりあえずこれさえあればOpenCVのインストールをし、C++で使用することができます。
以下のコマンドを実行してパッケージをインストールしてください。

$ sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

各パッケージの説明
build-essential: gcc, g++といったコンパイラやmakeなど
cmake: 今回はmakeビルドを行う際のmakefileを作成する目的で使用します。動作確認5.3.1の際にも使用しますのでこちら(https://kamino.hatenablog.com/entry/cmake_tutorial1) など参考にしてみてください。
git: 今回はOpenCVのソースコードを入手する際にのみ使用しますが、興味がある方はこちらを参考にしてください。
libgtk2.0-dev: GTKライブラリ開発用のパッケージらしいんですが、多分OpenCVのGUIフレームワーク関係
pkg-config: gcc, g++によるコンパイルを容易にします。動作確認5.3.2で簡単に説明します。
libavcodec-dev, libavformat-dev, libswscale-dev: FFmpegとLibavの開発用パッケージです。

1.2 Python-devとnumpy

Python2とPython3、およびそれぞれに対応するnumpyをインストールします。

$ sudo apt install python-dev python-numpy python3-dev python3-numpy

:warning:注意: pythonとpython-devは異なります。もうpythonは入れてあるよって方も上記コマンドを実行しておいてください!
python-devはpythonを含む開発者用パッケージです。重複してインストールしても問題ないです。)

Pythonのバージョン確認
#Python2のバージョン確認
$ python -V

#Python3のバージョン確認
$ python3 -V


numpyのバージョンは5.1, 5.2同様に__version__で確認できます。

1.3 オプション

下記パッケージをインストールしなくてもOpenCVを使うことはできます。
必要なものを選んでインストールしてください。
迷ったらとりあえずインストールしておきましょう。

$ sudo apt install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libvtk5-qt4-dev libqt4-dev libqt4-opengl-dev libgtkglext1 libgtkglext1-dev

各パッケージの説明
libtbb2, libtbb-dev: TBB(Threading Building Blocks)によって並列処理を行えるようにする
libjpeg-dev, libpng-dev, libtiff-dev: jpeg, png, tiff形式の画像ファイルを扱えるようにする
libdc1394-22-dev: IEEE1394 デジタルカメラ用の高レベルなプログラミングインターフェース
libvtk5-qt4-dev, libqt4-dev, libqt4-opengl-dev, libgtkglext1, libgtkglext1-dev: QT, OpenGL, GTKといったGUI関連のパッケージ

2. OpenCVソースコードの入手

こちらのリポジトリ(OpenCV)こちらのリポジトリ(OpenCV contrib)から、OpenCVとOpenCV contribのソースコードをホームディレクトリ直下に入れていきます。
(参考)opencv_contrib紹介

#ホームディレクトリへ移動
$ cd ~

#OpenCVソースコードを入手
$ git clone https://github.com/opencv/opencv.git

#OpenCV contribソースコードを入手
$ git clone https://github.com/opencv/opencv_contrib.git

branchを切り替えたい場合(インストールしたいOpenCVのバージョンを変えたい場合など)は~/opencv下でgit checkout 2.4.0 などしてください。

3. CMakeによるmakefileの作成

3.1 build用のディレクトリ作成

以下のコマンドを実行し、~/opencv直下にbuild用のディレクトリ(ここではbuildという名前のディレクトリ)を作成してください。

$ cd ~/opencv
$ mkdir build
$ cd build

3.2 CMakeの実行

CMakeLists.txtを参考にオプションを設定しながらCMake (makeビルドを行う際のmakefileを作成) します。
下記コマンドを実行してください。

$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_OPENGL=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D OPENCV_GENERATE_PKGCONFIG=ON ..

:warning:注意1: CMakeコマンド最後のtwo dots ..を忘れないようにして下さい!
(これは現在のディレクトリのひとつ上の階層を表しています。cmake実行時に参照するCMakeListsの場所を指定するためのものです。)

:warning:注意2: もし上記コマンドがうまくいかない場合は-DCMAKE_BUILD_TYPE=Releaseのように-Dの後ろのスペースをすべて削除して再度試してみてください
(-DはCMakeのオプションで、書き換えを意味します。)

オプションの説明
CMAKE_BUILD_TYPE: ビルド時のモードを指定
CMAKE_INSTALL_PREFIX: インストール先の指定
OPENCV_EXTRA_MODULES_PATH: OpenCV_contribのパスを指定
OPENCV_GENERATE_PKGCONFIG: pkgconfigに.pcファイルを作成(C++のコンパイル時に利用)
WITH_TBB: TBB(Threading Building Blocks)の利用(C++を並列処理で実行する)
WITH_OPENGL: OPENGLの利用
WITH_VTK: VTKの利用

CMake実行結果

ここまで上記手順通りに行うと、以下のような実行結果になると思います。
-- General configuration for OpenCV 4.1.2-dev =====================================
--   Version control:               4.1.2-121-g5dd3e6052e
--
--   Extra modules:
--     Location (extra):            /home/(ユーザー名)/opencv_contrib/modules
--     Version control (extra):     4.1.2-32-g61cbb445
--
--   Platform:
--     Timestamp:                   2019-11-10T16:00:51Z
--     Host:                        Linux 4.4.0-17763-Microsoft x86_64
--     CMake:                       3.10.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               Release
--
--   CPU/HW features:
--     Baseline:                    SSE SSE2 SSE3
--       requested:                 SSE3
--     Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
--       requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
--       SSE4_1 (16 files):         + SSSE3 SSE4_1
--       SSE4_2 (2 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
--       FP16 (1 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
--       AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
--       AVX2 (29 files):           + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
--       AVX512_SKX (6 files):      + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_COMMON AVX512_SKX
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++  (ver 7.4.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--gc-sections
--     Linker flags (Debug):        -Wl,--gc-sections
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hdf hfs highgui img_hash imgcodecs imgproc line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 quality reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab viz xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv java js matlab ovis sfm
--     Applications:                tests perf_tests apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:
--     GTK+:                        YES (ver 2.24.32)
--       GThread :                  YES (ver 2.56.4)
--       GtkGlExt:                  YES (ver 1.2.0)
--     OpenGL support:              YES (/usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so)
--     VTK support:                 YES (ver 7.1.1)
--
--   Media I/O:
--     ZLib:                        /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.11)
--     JPEG:                        /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 80)
--     WEBP:                        /usr/lib/x86_64-linux-gnu/libwebp.so (ver encoder: 0x020e)
--     PNG:                         /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.6.34)
--     TIFF:                        /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 / 4.0.9)
--     JPEG 2000:                   build (ver 1.900.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      YES (2.2.5)
--     FFMPEG:                      YES
--       avcodec:                   YES (57.107.100)
--       avformat:                  YES (57.83.100)
--       avutil:                    YES (55.78.100)
--       swscale:                   YES (4.8.100)
--       avresample:                NO
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            TBB (ver 2017.0 interface 9107)
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Intel IPP:                   2019.0.0 Gold [2019.0.0]
--            at:                   /home/(ユーザー名)/opencv/build/3rdparty/ippicv/ippicv_lnx/icv
--     Intel IPP IW:                sources (2019.0.0)
--               at:                /home/(ユーザー名)/opencv/build/3rdparty/ippicv/ippicv_lnx/iw
--     Lapack:                      NO
--     Eigen:                       YES (ver 3.3.4)
--     Custom HAL:                  NO
--     Protobuf:                    build (3.5.1)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/(ユーザー名)/opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.15)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.15+)
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.13.3)
--     install path:                lib/python2.7/dist-packages/cv2/python-2.7
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.6.8)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.6m.so (ver 3.6.8)
--     numpy:                       /usr/lib/python3/dist-packages/numpy/core/include (ver 1.13.3)
--     install path:                lib/python3.6/dist-packages/cv2/python-3.6
--
--   Python (for build):            /usr/bin/python2.7
--
--   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



を見るとpython2, python3それぞれのdist-packages/以下にcv2がインストールされているのがわかります。

4. makeインストール

makeビルドします。-j*はmakeコマンドのオプションで、makeビルドを並列処理します。
以下のコマンドを実行してください。30分くらいかかるかも。
公式ページに合わせて並列オプションは7に設定)

$ make -j7

続いてmake installです。
以下のコマンドを実行してください。

$ sudo make install

以上でインストール完了です!

5. 動作確認(バージョンの表示)

Python2, Python3に関してはすでにパスが通っていると思うので簡単です。
C++に関してはCMakeでMakefileを作るかpkg-configでパスを通すかします。

以下はすべて~/opencv直下で実行することを前提とします。
cd ~/opencv でホームディレクトリに移動してください。

5.1 Python2

コマンドラインからPythonを起動して対話モードでバージョンを表示させます。
(コマンドラインからのPython実行)

まずPython2の対話モードを起動します。

$ python2 #対話モードの起動

つづいて対話モードでOpenCVをインポート、OpenCVのバージョンを表示させます。

>> import cv2 #OpenCVのインポート
>> print(cv2.__version__) #バージョンの表示

これでインストールしたOpenCVのバージョンが表示されたら動作確認完了です。対話モードを終了させます。

>> exit() #対話モードの終了

5.2 Python3

5.1 python2の動作確認と全く同じことをpython3で実行できればOKです。

5.3 C++

CMakeを使う方法とpkg-configを使う方法を書いていたら意外と長くなってしまったので別記事に載せます。
OpenCVを使ったC++コードをコンパイルする(CMake, GCC, pkg-config)

6. その他

OpenCVを使えば画像認識などが捗ることはもちろん、様々な形式の画像ファイルを扱うのもとても簡単になるのが良いですよね。

本当は動作確認のためにバージョン表示に加えてもっとopencvっぽいことをしようとしたのですが、疲れたので今度にします

7. 参考

パッケージの内容検索(https://packages.ubuntu.com/ja/)
CMakeの使い方 その1~3(https://qiita.com/shohirose/items/45fb49c6b429e8b204ac#_reference-27dce2bd429efef9488e)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
32