Raspbian (Raspberry Pi 3 model B) に OpenCV 3.1 をインストールする

ラズパイ3の環境にOpenCV 3.1をソースからインストールする備忘録(作業メモ)です。 かなり冗長です悪しからず。

Webカメラをつないで終わりではありませんよね、ということでOpenCVです。 Raspbianの標準のパッケージとしてバージョン2.4系が提供されています*1が、新しい物好きなのでバージョン3.1をインストール。

過去記事でmacOS向けにフレームワーク形式でビルドしていますが、今回は共有ライブラリとしてRaspbian 向け(要するにLinux系)にビルドしています。
基本的にUbuntu/Debian系へのインストールと同じ要領です。

作戦としてまず基本モジュールのみ(B)でビルドできることを確認して、再度拡張モジュール(contrib)ありでビルドした関係で両方書いてあります。参考にする場合は必要に応じてA-Bの順序、またはA-Cの順序で。

A. 準備

基本的に以下のサイトの手順をベースにしています。主な違いはPython向けのバインディングPython 3系のみ、OCR用にTesseractをインストールしているあたりでしょうか。

Install guide: Raspberry Pi 3 + Raspbian Jessie + OpenCV 3 - PyImageSearch

環境

ファームウェアも更新済み。

ソースの入手

公式サイトからダウンロードする。

$ wget -O opencv-3.1.0.zip https://github.com/opencv/opencv/archive/3.1.0.zip
$ wget -O opencv_contrib-3.1.0.zip https://github.com/opencv/opencv_contrib/archive/3.1.0.zip

git cloneでタグを指定する方法でも問題ないはず。

依存するライブラリのインストール

ビルドに必要なツール

$ sudo apt install -y build-essential cmake  pkg-config

ビルド時のオプションをGUIで設定しないならcmake-qt-guiもインストールする。

$ sudo apt install cmake-qt-gui

OpenGL関連ライブラリ

$ sudo apt install mesa-utils
$ sudo apt install libgl1-mesa-dri

libgl1-mesa-driGUI付き版なら最初からインストールされいるようですが念のため。

原因不明ですが, 新機能であるGL Driverを有効にすると、imshowメソッド実行時に表示がおかしくなるのでraspi-configコマンドで無効化しておく。

静止画用のライブラリ

$ sudo apt install -y libjpeg-dev libtiff5-dev  libpng12-dev libjasper-dev

libjasper-devJPEG2000形式の画像ファイルのために必要。他は名前の通り、JPEGTIFFPNGのライブラリのためのヘッダファイル。依存関係でライブラリの本体もインストールされる。

動画関連のライブラリ

$ sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev

RaspbianのベースであるDebian (jessie) ではFFmpegの代わりに派生版であるLibavを利用するそうなので、FFmpegそのものは不要。Ubuntu は現在、FFmpeg を採用しているらしいので将来はどうなることやら。

highgui モジュール用

$ sudo apt install -y libgtk2.0-dev

OpenCVが提供するGUI構築用のモジュール。依存パッケージが結構あるのでかなり時間がかかる。

Protocol Buffer (オプション)

OpenCVの深層学習ライブラリ(open cv_dnn)を使う、かつ他の深層学習ライブラリで作成したモデルを使いたいなら必要。なくてもビルド自体はできる。

$ sudo apt install libprotobuf-dev protobuf-compiler

参考:OpenCVのDeep Learningモジュールの紹介 « Rest Term

protobuf-compilerはなくてもビルドは通る。

Visualization Toolkit

3Dモデルの表示とかそういう系。依存関係でQt4関係のパッケージがインストールされる関係でディスク領域を400MBくらい消費する。 GUIOpenGLサポートに必要なファイルも依存パッケージとして一緒にインストールされる(全部ではない)。

最新バージョンとして7系がリリースされているが、Raspbian ではバージョン5.8 もしくは6がインストールできる。 無難に5系をインストール。

$ sudo apt install libvtk5-dev libvtk5-qt4-dev

開発元サイト:VTK - The Visualization Toolkit

警告対策

VTKのPythonJava、Tcl/Tk 向けのバインディングが見つからないという警告が出るが、無視して問題ない。 気になるなら、下記のように該当するファイルを含むパッケージをインストールすれば一部は表示されなくなる。

$ sudo apt install python-vtk tcl-vtk

これでPythonとTcl/Tkについては警告が消える。Javaバインディングはパッケージ化されてないので消えない。そもそもOpenCV本体のJavaバインディングも有効化するつもりはないので問題ないはず。

警告メッセージはこんな感じ。

-- The imported target "vtkParseJava" references the file
   "/usr/bin/vtkParseJava"
but this file does not exist.  Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
   "/usr/lib/vtk-5.8/VTKTargets.cmake"
but not all the files it references.

Qt5と組み合わせるならVTKもQt 5向けにビルドされてないとまずいかも(未検証)。

パフォーマンス向上

行列演算の高速化に役立つ並列化のためのライブラリをインストール。

$ sudo apt install -y libatlas-base-dev gfortran libeigen3-dev

特にEigenが重要だろうと思われる。

参考:OpenCVのHALモジュールと高速な数値計算ライブラリ - Qiita

開発元ページ:Eigen


libtbb (libtbb-dev)についてはラズパイ用のパッケージは提供されていないが、ビルド時のオプションに下記を追加すればダウンロードしてくれる。

-D WITH_TBB=ON -D BUILD_TBB=ON


なお、インテル製CPU向けのライブラリであるIPPは当然使えない。

Video4Linux

$ sudo apt install libv4l-dev

motion とか guvcview とか他のツールの依存関係でインストールされているかもしれない。

Python モジュール

Python 3.x しか使う予定はないので小細工なし。

Python3 用のモジュールをビルドするためにヘッダファイルが必要*2。インストールされていなければ下記のようにしてインストールする。

$ sudo apt install -y python3-dev

Numpyも必要ですが、こちらはすでにインストールされているはず。

Qt4

OpenGL サポートの有効無効に関わらず、"GL Driver"を有効にすると表示がおかしくなるのでQt自体のみ有効に。

Qt4を一式インストールしておくとhighgui のQt拡張が有効になる。また、GUIOpenGLサポートを無効にするために明示的にオプション(-D WITH_OPENGL=OFF)を指定する必要があります。

OpenCV側からすればQt5でも構わないはずですが、一部のパッケージがQt4を前提にしているので無理しないのがベター。 パッケージの依存関係ですでにQt4がインストールされているので足りないものだけ。

$ sudo apt install libqt4-core libqtgui4 libqt4-test libqt4-opengl-dev

libqt4-core 以外はVTKの依存関係でインストールされる。

document 生成用

PlantUMLとdoxygensphinxを用意しておく。

PlantUML

Download page からPlantUMLを入手(バージョン番号付きの方)。

$ sudo cp plantuml.8048.jar /usr/share/java

'/usr/share/java' に配置した状態で、

バージョン番号を気にせずに済むようにシンボリックリンクを作成しておく。

$ cd /usr/share/java
$ sudo ln -s plantuml.8048.jar plantuml.jar

念のため確認。

$ ls -l plantuml.jar
lrwxrwxrwx 1 root root 17 10月 14 22:42 plantuml.jar -> plantuml.8048.jar
Doxygen & Sphinx
$ sudo apt install sphinx-common doxygen

Sphinx はどちらかというとPythonのドキュメント用に必要。

B. ビルドとインストール(contrib なし)

ソースコードの展開。

$ unzip opencv-3.1.0.zip

展開したディレクトリに移動して作業ディレクトリを作成する。

$ cd opencv-3.1
$ mkdir build
$ cd build

Makefile の生成(cmake)

念のため、ldconfigを実行して共有ライブラリ情報を更新しておく。

$ sudo /sbin/ldconfig

オプション付きでcmakeを実行する。

末尾の..はソースファイルの場所*3を指定している(CMakeLists.txt の場所)ので必要です。

ドキュメントにUMLが不要なら-D PLANTUML_JARの行は不要。ドキュメント自体が不要なら-D BUILD_DOCS=OFFを指定する。

ENABLE_VFPV3という最適化オプションもあるが、ENABLE_NEONと同時に有効にはならない模様。

そのほかオプションはソースファイル直下のcmakeディレクトリにある拡張子が".cmake"のファイルを参照。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
    -D ENABLE_NEON:BOOL=ON \
    -D WITH_TBB=ON -D BUILD_TBB=ON \
    -D WITH_QT=ON -D WITH_OPENGL=OFF \
    -D BUILD_EXAMPLES=ON ..


OpenGL サポートが必要なら以下のようにする。"raspi-config"で"GL Driver"を有効にしたところ、私の環境では正常に動作しませんでした。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
    -D ENABLE_NEON:BOOL=ON \
    -D WITH_TBB=ON -D BUILD_TBB=ON \
    -D WITH_QT=ON -D WITH_OPENGL=ON \
    -D BUILD_EXAMPLES=ON ..


正常に終了すれば末尾に下記のように出力されるはず。

-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/work/opencv-3.1.0/build

気になるなら終了ステータスを確認する。

$ echo $?
0

あくまでも直前のコマンドのステータスをチェックするだけなので他のコマンドの実行してしまった後だと意味がないので注意。

ビルド

$ make -j2

ラズパイ3はクアットコアなので-j4の方がコンパイル時間が短くなるが、CPU温度が80度を超えてしまい、警告マークが表示されてしまう。熱暴走はよろしくないので大事をとって-j2

インストール

$ sudo make install

/usr/local 配下の各ディレクトリにインストールされる。

動作確認

Pythonモジュールが正常に読み込めるかどうかでひとまず確認。

$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
>>> quit()

ひとまずはOK。

アンインストール手順

ビルドに使ったディレクトリ(上記の例ではソースを展開したディレクトリの配下にある'build'というディレクトリ)を削除していないことが前提*4Makefile のあるディレクトリで、下記を実行すれば削除できる。

$ sudo make uninstall


C. ビルドとインストール(contribあり)

こっちが本命。

Tesseract のインストール。

$ sudo apt install -y libtesseract-dev libleptonica-dev tesseract-ocr 
$ sudo apt install -y tesseract-ocr-jpn tesseract-ocr-osd

libleptonica-devが必要なことに気づかずにちょっとハマった。また、tesseract-ocr-devはダミーパッケージなので不要*5

この状態でcmakeを実行すれば自動検出されるはず。

先程と同様にldconfig

$ sudo /sbin/ldconfig

Makefile の生成(cmake)

ソースコードの展開先で作業用フォルダを作成して移動。

$ mkdir build_with_contrib
$ cd build_with_contrib

オプション付きでcmakeを実行する。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
    -D ENABLE_NEON=ON \
    -D WITH_TBB=ON -D BUILD_TBB=ON \
    -D WITH_QT=ON -D WITH_OPENGL=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.1.0/modules \
    -D BUILD_EXAMPLES=ON ..

正常に終了していれば長々と機能の有効無効が表示された後に以下のような完了メッセージが出る。

-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/work/opencv-3.1.0/build_with_contrib

エラーが云々とか出ていたら素直にメッセージを読む。ログが流れてしまっている場合は、CMakeFilesというディレクトリにCMakeError.logと、CMakeOutput.logというファイルがあるので確認する。


ちゃんとTesseract が検出されているかはcmake の出力で確認("-- General configuration for OpenCV 3.1.0 ..."の前)。

-- Tesseract:   YES

必要なモジュールがビルド対象に入っているかを確認する。以下参考。お目当てはtextsuperresなんで問題なし。

--   OpenCV modules:
--     To be built:                 core flann imgproc ml photo reg surface_matching video viz dnn fuzzy imgcodecs shape videoio highgui objdetect plot superres ts xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo structured_light tracking videostab xfeatures2d ximgproc aruco optflow stitching python3
--     Disabled:                    world contrib_world
--     Disabled by dependency:      -
--     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures
2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudaw
arping cudev java python2 cvv hdf matlab sfm

ビルド

$ make -j2

ラズパイ3はクアッドコアなので-j4でも良いが、発熱の関係で自重した。空冷ファンの導入を検討中。

インストール

$ sudo make install

動作確認

C++で簡単なコードを動かしてみます。ネタ元はオライリーの本(ただしEarly Release版)。

Learning Opencv 3: Computer Vision in C++ With the Opencv Library

Learning Opencv 3: Computer Vision in C++ With the Opencv Library

最新のRaspbianではOpenCV 2.4系がプリインストールされているので、間違ってリンクされないように対策を。

参考:OpenCV 備忘録: RASPBIAN JESSIEで自前のOpenCVを利用するには

具体的には、コンパイル時にLD_LIBRARY_PATHを設定してビルドします。


オライリー本のExample 2-7 そのままです。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

int main( int argc, char** argv){

    cv::Mat img_rgb, img_gry, img_cny;

    cv::namedWindow( "Example Gray", cv::WINDOW_AUTOSIZE );
    cv::namedWindow( "Example Canny", cv::WINDOW_AUTOSIZE );

    img_rgb = cv::imread( argv[1]);

    cv::cvtColor( img_rgb, img_gry, cv::COLOR_BGR2GRAY);
    cv::imshow( "Example Gray", img_gry );

    cv::Canny( img_gry, img_cny, 10, 100, 3, true );
    cv::imshow( "Example Canny", img_cny );


    cv::waitKey(0);
    return 0;
}

コンパイルしてサクッと実行。

$ export LD_LIBRARY_PATH=/usr/local/lib
$ g++ ex2-7.cpp -l opencv_core -l opencv_highgui -l opencv_imgproc -l opencv_imgcodecs
$ ./a.out photo.jpg

実行すると下記のようにグレイスケール画像とエッジ抽出した結果が表示される。とりあえず基本機能は動いてます。

f:id:atuyosi:20161017235816p:plain


[2016/10/21 追記]

上記のLD_LIBRARY_PATHよりもpkg-configを活用する方が良さそうです。

make installすると、/usr/local/lib/pkgconfig/opencv.pcというファイルがコピーされるのでこれをopencv3.pcという名前にリネーム*6

この状態で例えば以下のように実行すると、下記のようになります。

$ pkg-config opencv3 --cflags
-I/usr/local/include/opencv -I/usr/local/include

他にも--libsというオプションもあり、そちらはライブラリのパスとライブラリの名称を返します。 組み合わせると、コンパイラにシェルのバッククォート記法でpkg-config opencv3 --cflags --libsの出力を渡せば確実に/usr/local/libにあるOpenCV 3.Xのライブラリを使わせることができます。


具体例:

$ g++ `pkg-config opencv3 --cflags --libs` ex2-7.cpp 

ネタ元: OpenCV By Example

[追記ここまで]

申し送り事項

遭遇したエラーなど

GL Driver

ビルド時の問題ではないですが、最初の方に書いた通り、9月リリースのラズパイの新機能であるGL Driver を有効にするとcv::imshowが正常に機能しませんでした。ビルドオプションの問題なのか、Xの設定なのか、ドライバ(''vc4-kms-v3d"かな?)の問題化はよくわかりません。


[2016/11/28 追記]

GL Driver は無関係で、Swap の容量不足なだけかも。要調査。

Raspbianの初期状態ではSwapメモリは100MB。そのうえでGL Driver を有効化する際にGPUへのメモリ割当量を増やすとその分だけメインメモリ容量が減るので余計にメモリ不足が顕在化する?

問題を報告したところ*7GPUの"texture unit"というコンポーネントが2048x2048までしかサポートしていないから云々という回答が返ってきている。

とりあえず2048x2048ピクセル以下の画像であれば問題は起きないはず。

[追記ここまで]

CMake 関係

以下の警告が出ているとサンプルコードのビルドに失敗する。メモし忘れたので申し訳ないが、"定義されていない参照です"云々系のエラーだったはず。

対処方法としては、一旦作業していディレクトリ(上記の例では 'build_with_contrib' )を削除してcmakeからやり直す。試していませんが、make cleanでも大丈夫かも。

多分、試行錯誤の過程で、Tesseract_LIBRARYを指定した際に間違った値が残ってたのだろうと思う。

WARNING: Target "opencv_text" requests linking to directory "/usr/lib".  Targets may link only to libraries.  CMake is dropping the item.
WARNING: Target "opencv_text" requests linking to directory "/usr/lib".  Targets may link only to libraries.  CMake is dropping the item.

有効にできていないモジュール

'world' と 'contrib_world' というモジュールはそれぞれ全モジュールをまとめて有効化するための抽象的なモジュールなので 基本的に無視。CUDA系のモジュールも対応するグラフィックカードが必要なので諦める。


モジュールのリスト:OpenCV: Modules

opencv_sfm

Structure from motion用のモジュールらしい。

複数枚の静止画から3次元情報を取り出すというすごいヤツ。

モジュールの説明:OpenCV: SFM module installation

最低限、libgoogle-glog-dev とlibgflags-dev で解決しそう。Ceres Solverというライブラリが推奨されているがRaspbianのパッケージには存在しない。まあ最悪ソースからビルドすれば行けそう。

参考:ubuntu 14.04上でOpenCV 3.1.0の SfMを試してみた その1 - Qiita

opencv_hdf

HDF5 サポートのモジュール。まあ使わないだろう。 libhdf5-devパッケージあたりでいけるのかもしれない。

opencv_cvv

デバッグ用のモジュール。"opencv_contrib-3.1.0/modules/cvv/CMakeLists.txt"を見る限り、Qt5が必要。Qt4と混在できるんだっけ? Qt4を前提にしているライブラリがあると事故りそうなんで見送り。

やろうと思えば有効化できそうだがしていない機能
  • libgphoto2: libgphoto2-dev
  • libdc1394: libdc1394-22-dev をインストールすれば有効にできるが、そもそもラズパイにIEEE1394ポートはない
  • gstreamer: libgstreamer1.0-dev をインストールすれば良いはず
  • xine: libxine2-dev だろうと思うがそもそも "xine" というのはDVDプレーヤーだったはず
不明(というか不要)

正直なところ、ハードウェアがないと意味がないか、ライセンスがないので無意味と思われる。

  • XIMEA : XIMEA社製のカメラのサポートらしい
  • Matlab: matlab-support-dev? そもそもライセンスを買う必要があるのではないだろうか

そのほか

そのほか、補足事項色々。

オプションの一覧

ソースコードを展開したディレクトリの直下にあるCMakeLists.txtを眺めればだいたい把握できるはず。

各オプションを有効にするためのライブラリの存在チェック条件は、cmakeディレクトリ配下にある拡張子が'*.cmake'のファイルを確認する。

GitHabでも確認できる。

まとめ

目標はWebカメラで画像を撮って、超解像モジュールで拡大してOCR…など。もしくはsfmモジュールを有効にしてカメラ撮影した静止画から3D再構築とかそういうの。

ラズパイで超解像は処理が重すぎて無理があるようです。入力がカメラまたは動画に限定されてしまうのも厳しい。

*1:libopencv-core2.4という名称で提供されており、GUI付きのOSイメージには最初からインストールされている。また、Python 2.x 系用のバインディングのパッケージも提供されている。

*2:Python 2.X 向けのモジュールが必要なら'python2.7-dev'をインストールし、明示的にPythonバインディングのバージョンを指定する

*3:'..'でカレントディレクトリの一つ上のディレクトリの意味

*4:インストール先の情報がセットされていけないため

*5:おそらくパッケージ名の変更による問題を回避するためのもので、インストールしても良いが意味はない。

*6:2.4系のインストール時にopencv.pcファイルがコピーされていなければリネームせずにpkg-configコマンドの引数にそのままopencvと指定すれば問題ないです

*7:報告先が妥当なのか、甚だ疑問ではあるが