ラズパイにOpenCV 3.2 をインストールする(暫定版)
スポンサーリンク
前回の記事で年内の最後の予定だったけどせっかくなので。
ほぼ作業メモみたいなものです。
環境
- Raspbian
- Raspberry Pi 3 model B
準備
旧バージョンのアンインストール(元からインストールされている場合のみ)
OpenCV 3.1 をビルドしたディレクトリ(私の環境では~/work/opencv-3.1.0/build*1)に移動して下記を実行。
$ sudo make uninstall
ついでにmicroSDを圧迫するのでコンパイル時の中間生成物など古いファイルは削除しておく。
作業ディレクトリの作成
適当な場所に作業ディレクトリを作成して移動。
$ mkdir work $ cd work
依存ライブラリについては過去記事参照。
ソースの入手
公式からOpenCV 本体と拡張モジュール(contrib)のソースを入手。
- 本体:DOWNLOADS | OpenCV
- 拡張モジュール(contrib):Releases · opencv/opencv_contrib · GitHub
本体の方は"OpenCV for Linux/Mac"というリンクをクリック。拡張モジュールの方は3.2.0の"tar.gz"のリンクから。
wget
でダウンロードするなら下記のようにする。
$ wget https://github.com/opencv/opencv/archive/3.2.0.zip $ wget https://github.com/opencv/opencv_contrib/archive/3.2.0.tar.gz
展開
$ unzip opencv-3.2.0.zip $ tar zxf opencv_contrib-3.2.0.tar.gz
本体の展開先に移動し、cmake用の出力先ディレクトリを作ってそこに移動。
$ cd opencv-3.2.0/ $ mkdir build_with_contrib $ cd build_with_contrib
ビルド
最初から拡張モジュール(contrib)ありでビルドします。
CMake
前回と同じ要領で行くと、下記のバグ?に遭遇するのと、C++のチュートリアル(Example)のビルドでこけるのでそこを踏まえてcmake
を実行。
またfreetype
というcontribのモジュールも無効化します(後述)。
TBBは並列化のためのバックエンドの一つ。つまり代替手段があるので無効化しても問題ない。
$ 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=OFF -D BUILD_TBB=OFF \ -D WITH_QT=ON -D WITH_OPENGL=OFF \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \ -D BUILD_opencv_freetype=OFF \ -D BUILD_EXAMPLES=OFF ..
前回との変更点は以下のとおり。
- TBBの無効化("-D WITH_TBB=OFF -D BUILD_TBB=OFF"に変更)
- 8行目のOPENCV_EXTRA_MODULES_PATHを3.2向けに修正
freetype
モジュールをビルドしないように(-D BUILD_opencv_freetype=OFF)- サンプルをビルドしないように( -D BUILD_EXAMPLES=OFF )
cmake
の出力で、必要なモジュールが有効になっていることを確かめる。また、freetype
がDisabledのリストに存在することを確認する。
以下参考。
CMake configuration for OpenCV 3.2 (with contrib) 2016/12/30 on Raspbian jessie · GitHub
ビルド
$ make -j4
空冷ファンありなので発熱は気にせずに4並列でコンパイル。
使用しているのはUSB接続の小型ファンです。電源はHDMIディスプレイのUSBハブから確保しています。
タイムリー USBファン [ 40mm角ファンモデル ] LittleFAN40U
- 出版社/メーカー: タイムリー
- 発売日: 2015/06/03
- メディア: Personal Computers
- この商品を含むブログを見る
輪っかにしたマスキングテープを両面テープ代わりにして固定しているだけです。小型ファンの宿命として騒音がかなり気になります。
取り付け方法によっては振動も気になりますが、発熱による警告マークは表示されません。
インストール
$ sudo make install
普通にインストールするだけ。
動作確認
C++
過去記事と同じコードをビルドして実行できたらひとまずOKとします。
#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; }
過去記事と同じです。sample.cpp
というファイル名で保存して下記の手順でビルド。pkg-config
を使うのはデフォルトでインストールされているOpenCV 2.4が間違ってリンクされるのを防ぐため。
$ g++ `pkg-config opencv --cflags --libs` sample.cpp
以下のようにグレースケール画像とエッジ抽出の結果が表示されれば問題なし。
Python 3
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.2.0' >>>
遭遇したエラーとその対処
以下、遭遇したエラーメッセージとその対処。基本的にビルド時に無効化しただけですが。
エラーメッセージでググった時にヒットすることを期待しています。読む必要は特になし。
TBB関連
[2017/06/08 追記]
最新の開発版では修正されているようです。そのうちリリースされるであろうOpenCV 3.3 で取り込まれると思われます。
c.f. TBB: fix build on ARM by mshabunin · Pull Request #8844 · opencv/opencv · GitHub
[追記ここまで]
エラーメッセージをメモし忘れた。現象は下記と同じ。
TBB compile error 3.1-dev · Issue #7890 · opencv/opencv · GitHub
前述の通り別の選択肢があるので無効にして回避。
-D WITH_TBB=OFF -D BUILD_TBB=OFF
バージョン3.1の時はすんなり通ったはずなんだけど。
[2017/01/23 追記]
解決先らしきものが issuesトラッカーに投稿されている。
- TBB compile error 3.1-dev · Issue #7890 · opencv/opencv · GitHub
- opencv/arm_linux_stub.cpp at master · opencv/opencv · GitHub
freetype モジュール
[2017/06/08 追記]
こちらについても最新の開発版では修正されているようです。
[追記ここまで]
ビルド自体は成功するかに見えるが、Python 3でOpenCVモジュールをロードしようとすると下記のエラーに遭遇する。
>>> import cv2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: /usr/local/lib/libopencv_.so.3.2: undefined symbol: hb_shape
必要なライブラリであるfreetype2
とharfbuzz
はインストールされているので問題ないはずだが、実際にはエラーになっている。
関連:OpenCVのcontribにモジュールを追加してPRしてみた - Qiita
便利なモジュールが増えるのはいいことだけど、 使わない立場からすると微妙。環境依存でビルドに失敗するからといって文句言うのは筋違いなんだけど。
Githubの最新版では修正されているかも。
macOS環境のビルドエラーの修正だけど、他のバグも一緒にクローズされてる。なのでこの問題も修正されているかもしれない。未検証。
Example ビルドエラー
これも前述のfreetype関連なのか?
[ 84%] Building CXX object samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/tutorial_code/calib3d/real_time_pose_estimation/src/RobustMatcher.cpp.o [ 84%] Linking CXX executable ../../bin/cpp-tutorial-pnp_registration ../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_get_glyph_infos' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_font_destroy' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_ft_font_create' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_add_utf8' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_destroy' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_shape' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_guess_segment_properties' に対する定義されていない参照です ../../lib/libopencv_freetype.so.3.2.0: `hb_buffer_create' に対する定義されていない参照です collect2: error: ld returned 1 exit status samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/build.make:345: recipe for target 'bin/cpp-tutorial-pnp_registration' failed make[2]: *** [bin/cpp-tutorial-pnp_registration] Error 1 CMakeFiles/Makefile2:21767: recipe for target 'samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/all' failed make[1]: *** [samples/cpp/CMakeFiles/cpp-tutorial-pnp_registration.dir/all] Error 2
ぶっちゃけなくてもいいので素直にOFFにする。
-D BUILD_EXAMPLES=OFF
まとめ
最低限の確認しかしていませんが、ひとまずビルド成功です。
ではまた。