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
環境
- Raspberry Pi 3 model B
- Raspbian GNU/Linux 8.0 (jessie) 2016-09-23版+update
- Kernel 4.4.21-v7+
ファームウェアも更新済み。
ソースの入手
公式サイトからダウンロードする。
$ 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-dri
はGUI付き版なら最初からインストールされいるようですが念のため。
原因不明ですが,
新機能であるGL Driverを有効にすると、imshow
メソッド実行時に表示がおかしくなるのでraspi-config
コマンドで無効化しておく。
静止画用のライブラリ
$ sudo apt install -y libjpeg-dev libtiff5-dev libpng12-dev libjasper-dev
libjasper-dev
はJPEG2000形式の画像ファイルのために必要。他は名前の通り、JPEG、TIFF、PNGのライブラリのためのヘッダファイル。依存関係でライブラリの本体もインストールされる。
動画関連のライブラリ
$ 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くらい消費する。 GUIのOpenGLサポートに必要なファイルも依存パッケージとして一緒にインストールされる(全部ではない)。
最新バージョンとして7系がリリースされているが、Raspbian ではバージョン5.8 もしくは6がインストールできる。 無難に5系をインストール。
$ sudo apt install libvtk5-dev libvtk5-qt4-dev
開発元サイト:VTK - The Visualization Toolkit
警告対策
VTKのPythonやJava、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拡張が有効になる。また、GUIのOpenGLサポートを無効にするために明示的にオプション(-D WITH_OPENGL=OFF
)を指定する必要があります。
OpenCV側からすればQt5でも構わないはずですが、一部のパッケージがQt4を前提にしているので無理しないのがベター。 パッケージの依存関係ですでにQt4がインストールされているので足りないものだけ。
$ sudo apt install libqt4-core libqtgui4 libqt4-test libqt4-opengl-dev
libqt4-core
以外はVTKの依存関係でインストールされる。
document 生成用
PlantUMLとdoxygen、sphinxを用意しておく。
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'というディレクトリ)を削除していないことが前提*4。 Makefile のあるディレクトリで、下記を実行すれば削除できる。
$ 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
必要なモジュールがビルド対象に入っているかを確認する。以下参考。お目当てはtext
とsuperres
なんで問題なし。
-- 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
- 作者: Adrian Kaehler,Gary Bradski
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2017/01/02
- メディア: ペーパーバック
- この商品を含むブログを見る
最新の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
実行すると下記のようにグレイスケール画像とエッジ抽出した結果が表示される。とりあえず基本機能は動いてます。
[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へのメモリ割当量を増やすとその分だけメインメモリ容量が減るので余計にメモリ不足が顕在化する?
問題を報告したところ*7、GPUの"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のパッケージには存在しない。まあ最悪ソースからビルドすれば行けそう。
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- How To Use Gflags (formerly Google Commandline Flags)
- Ceres Solver — A Nonlinear Least Squares Minimizer
参考: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プレーヤーだったはず
不明(というか不要)
正直なところ、ハードウェアがないと意味がないか、ライセンスがないので無意味と思われる。
そのほか
そのほか、補足事項色々。
オプションの一覧
ソースコードを展開したディレクトリの直下にあるCMakeLists.txt
を眺めればだいたい把握できるはず。
各オプションを有効にするためのライブラリの存在チェック条件は、cmake
ディレクトリ配下にある拡張子が'*.cmake'のファイルを確認する。
GitHabでも確認できる。
- バージョン 3.1 用:opencv/CMakeLists.txt at 3.1.0 · opencv/opencv · GitHub
- 最新版:opencv/CMakeLists.txt at master · opencv/opencv · GitHub
まとめ
目標は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:報告先が妥当なのか、甚だ疑問ではあるが