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