More Related Content Similar to OpenCVをAndroidで動かしてみた Similar to OpenCVをAndroidで動かしてみた (20) OpenCVをAndroidで動かしてみた1. 日本Androidの会 京都支部
第3回 勉強会
(2011-12-03)
OpenCV を
Android で動かしてみた
Toru UENOYAMA
@ 日本Androidの会 京都支部
2. 自己紹介
名前
上野山 徹 (うえのやま とおる)
Google+ : Toru UENOYAMA
出身
和歌山県
• みかん と 梅干し と
タチウオ と カレー で有名
和歌山県
仕事
京都の電機メーカーで
(組み込み + 画像処理)/2なソフト開発してます
4. OpenCVとは
オープンソースの画像処理ライブラリ
コンピュータビジョンに関する
数多くの機能を提供する
最新研究の画像処理技術やGPGPUにも対応
言語インターフェイス
• 元はC言語向け
• 今では C++, Python, Ruby, Java などなど
対応OS
• Windows, MacOS, Linux, FreeBSD, iOS, Android など
ホビーユースから学術研究用途まで
幅広く使える画像処理ライブラリです!
4
5. OpenCVの機能
各種フィルタなど 幾何表現や
汎用画像処理 画像特徴量
複数カメラで
領域分割・切出し の三次元復元
色変換・形状変換
フィッティング
機械学習,形状
認識,顔検出 移動物体の追跡
http://opencv.willowgarage.com/wiki/
5
6. OpenCV の実用例
DARPA Grand Challenge
制限時間内に車両自律走行で
走破させる競技
多くのチームが
OpenCVを使用
一部の画像処理検査装置
研究機関でのアルゴリズム評価ソフト
http://en.wikipedia.org/wiki/DARPA_Grand_Challenge
http://www.cengen.com/content/darpa-grand-challenge-2004
6
7. OpenCV の 歴史
略歴
1999年 Intelにて開発がスタート
2006年 正式版(1.0)リリース
2008年 WillowGarage(米ベンチャー)が開発を引継ぐ
バージョン
Ver 年月 主な変更内容
1.0 2006年10月 正式リリース
1.1α 2008年10月 バグ修正,機能追加
2.0 2009年9月 C++インターフェイス追加
2.1 2010年4月 機能追加,TBB対応
2.2 2010年12月 ライブラリ構成の見直し(細分化), CUDA対応
2.3 2011年6月 Androidに正式対応,機能追加
2.3.1 2011年7月 Android版のAPI充実
7
8. OpenCVの特徴
実装機能が豊富
画像処理に関することはほぼ網羅されている
• 新機能もどんどん追加されている
豊富すぎて必要な機能を探すのが大変だったり
機能の粒度が小さい
必要な機能だけを組み合わせて使える
• (無駄がない)
ほしい機能を作るためには,関連する関数を
適切に組み合わせないといけない
8
9. OpenCVの特徴
ドキュメントが全体的に不足
リファレンスに行間が多すぎ
リファレンス化されていない関数も多い
• マイナー言語の場合は,C/C++言語向けの内容と
ソースコードを見比べながら試行錯誤…
面倒ごともありますが,ベタな実装と比較すれば
画像処理プログラミングが
かなり楽になります!
9
11. OpenCV for Android
概要
OpenCV 2.2 以前でもAndroidで動作したものの…
これから使うなら 最新版(2.3.1beta2)のPrebuilt
パッケージがおすすめ
動作環境
Android ≧ 2.2 (APIレベル ≧ 8)
※ JavaAPIを用いない場合は Android ≧ 1.5 (APIレベル≧3)
インストール方法
http://bit.ly/nqPTnO を参照してください。
11
12. Android版を使う上でまず考えること
どちらのAPIを使うか
① Java APIを使う
② C++ APIを使う (NDK)
③ ハイブリッド(①+②)
カメラ画像をどのように取得するか
① Android のカメラ機能
② OpenCV のカメラ機能
⇒ それぞれ,以降のページで説明します
12
13. Java API for Android
特徴
Java上で実装・ビルドする。
• NDKは不要
API呼び出し時のオーバーヘッドが大きい
• API内部の処理はNDKでビルド済のため変わらないハズ
デバッグは楽 SurfaceView
PC版とAPI仕様が
異なる 行わせたい画像処理 in Java
オーバーヘッド大
Java API (OpenCV)
OpenCV for Android
Native Library (OpenCV)
13
14. C++ API for Android
特徴
C++によりネイティブコードでOpenCVを呼び出す
Java側(UI側)からの呼び出しは,
JNIラッパーを作成しなければならない
NDKでのビルドが必要
デバッグが面倒 SurfaceView
Java側からの呼び出しを UI側の処理 in Java
減らすことで,オーバー JNIラッパー(自作する)
ヘッドを減らせる
行わせたい画像処理 in C++
PC版と同じAPIを使える
OpenCV for Android Native Library (OpenCV)
14
15. Androidのカメラ機能を使う場合
Android OSのカメラ SurfaceView Activity
機能を用いてyuv形式
で取得したのち, SampleViewBase
OpenCVのMat型に
変換する。 Sample1View Sample1Java
OS標準のAPIを用いる
ため,機種
依存性が小 Mat型変数(mYuv)にカメラ画像のByte配列を格納
少し遅いかも
SurfaceViewに描画するため,
Mat型からBitmapを生成して戻る
15
16. OpenCVのカメラ機能を使う場合
OpenCVのカメラ画像 SurfaceView Activity
取得API(highgui.VideoCaputure)
を用いて画像データを SampleCvViewBase
取得する。
Sample2View Sample2View
機種依存性が高い
VideoCapture.retreive で直接Mat
処理が軽いかも 型変数にカメラ画像を取得。
SurfaceViewに描画するため,
Mat型からBitmapを生成して戻る
16
17. リファレンス情報(1/2)
http://opencv.jp/
日本語のリファレンスが存在する
• REFERENCE MANUAL → C++リファレンス
• COOKBOOK [おすすめ]
少し情報が古い(Ver2.2相当)
Java版が無いので、C++版から読み替えが必要
http://opencv.itseez.com/modules/refman.html
英語だが最新リファレンス(Ver2.3相当)
JavaAPIの記述がないので読み替えが必要
17
18. リファレンス情報(2/2)
Javadoc でソースから生成する
Java API のリファレンスが手に入る
• クラス構造などは参考になる
説明はわかりにくい
• 結局C++リファレンスと
にらめっこになる
Javadocの生成方法
> javadoc –help
> cd <ソース解凍先>¥OpenCV-2.3.1
> javadoc -sourcepath src -d javadoc -subpackages org.opencv
『詳解 OpenCV』(オライリー社)
画像処理アルゴリズムの考え方も含め
丁寧に記述されている
C API (≠C++) のため読み替えがさらに大変
18
19. Androidで実装するときのTIPS
まずはPC版OpenCVでアルゴリズムを検討し、
その後Androidに移植すると良さそう。
OpenCVのライブラリサイズが大きい(5MB強)ため、
デバッグ時の転送&展開に時間がかかる。
JavaAPIの情報が少ないため、想定通りに動かな
い場合の切り分けが難しい。
端末によってカメラの解像度や写りの質・
CPU速度などが異なるため、一様には
動作してくれないことにも注意する。
19
22. 全体処理の流れ
ドロイドくん ギアボックス
②左右モーターの
内蔵カメラ 回転速度と
駆動時間を指令
①OpenCVで
ドロイドくんの
Androidケータイ 位置を検出 Arduino
http://ja.wikipedia.org/wiki/Arduino , http://www.tamiya.com/japan/products/70168double_gearbox/index.htm
23. ①画像処理
緑色の領域を抽出し,サイズが最も大きな
領域をドロイド君人形と認識させる。
カメラ画像を取得 “色”で分離しやすい
指標に変換 (色相)
RGB→HSV変換
(彩度)
色相,彩度,輝度
緑色のピクセルだけ
で制限をかける にマークをつける (輝度)
ノイズ除去
領域に分割
最大の領域を
見つける
モータ制御値を 抽出領域の中心が
生成(&送信) 画面中央に来るように
23
26. ②モーターを動かす
【ハード構成】 【ソフト構成】
画像追跡ソフト
Android端末
OpenCV
Microbridge
通信ソケットのようなものを
USB 張ってくれます
今回は,左右モーターの回転
USBホストシールド
時間と回転速度を指令
(Down方向のみ)
Arduino
(マイコン基板) モーター制御ソフト
回転方向の モータードライバ
選択と, シールド 指令された回転時間・速度に
電力増幅 PWM なるように,PWMを生成
(約500円) PWM
タミヤモーター
26
30. まとめ
和歌山県は
近畿地方です!
30
特別出演:あり太君 http://twitter.com/shokokanko
31. まとめ <Take2>
You + Android = Androidはより優秀なWeb端末
You + Android + OpenCV =
Androidが簡単に画像処理機能を持てる!
You + Android + OpenCV + Micro Processor =
Androidが ”アンドロイド” に進化する!!
OpenCVやマイコンで
一緒に遊びませんか?
→『日本 Android の会 京都支部』
http://groups.google.com/group/android-kyoto
31