32
OpenCV Android で動かしてみた Toru UENOYAMA 日本Androidの会 京都支部 日本Androidの会 京都支部 3勉強会 (2011-12-03)

OpenCVをAndroidで動かしてみた

Embed Size (px)

Citation preview

Page 1: OpenCVをAndroidで動かしてみた

OpenCV を Android で動かしてみた

Toru UENOYAMA

@ 日本Androidの会 京都支部

日本Androidの会 京都支部 第3回 勉強会

(2011-12-03)

Page 2: OpenCVをAndroidで動かしてみた

自己紹介

名前

上野山 徹 (うえのやま とおる)

Google+ : Toru UENOYAMA

出身

和歌山県

• みかん と 梅干し と タチウオ と カレー で有名

仕事

京都の電機メーカーで (組み込み + 画像処理)/2なソフト開発してます

和歌山県

Page 3: OpenCVをAndroidで動かしてみた

What’s OpenCV ?

Page 4: OpenCVをAndroidで動かしてみた

OpenCVとは

オープンソースの画像処理ライブラリ

コンピュータビジョンに関する 数多くの機能を提供する

最新研究の画像処理技術やGPGPUにも対応

言語インターフェイス

• 元はC言語向け

• 今では C++, Python, Ruby, Java などなど

対応OS

• Windows, MacOS, Linux, FreeBSD, iOS, Android など

4

ホビーユースから学術研究用途まで 幅広く使える画像処理ライブラリです!

Page 5: OpenCVをAndroidで動かしてみた

OpenCVの機能

http://opencv.willowgarage.com/wiki/

5

各種フィルタなど 汎用画像処理

領域分割・切出し

色変換・形状変換

機械学習,形状 認識,顔検出 移動物体の追跡

幾何表現や 画像特徴量

複数カメラでの三次元復元

フィッティング

Page 6: OpenCVをAndroidで動かしてみた

OpenCV の実用例

DARPA Grand Challenge 制限時間内に車両自律走行で

走破させる競技

多くのチームが OpenCVを使用

一部の画像処理検査装置

研究機関でのアルゴリズム評価ソフト

6

http://en.wikipedia.org/wiki/DARPA_Grand_Challenge http://www.cengen.com/content/darpa-grand-challenge-2004

Page 7: OpenCVをAndroidで動かしてみた

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充実

Page 8: OpenCVをAndroidで動かしてみた

OpenCVの特徴

実装機能が豊富

画像処理に関することはほぼ網羅されている

• 新機能もどんどん追加されている

豊富すぎて必要な機能を探すのが大変だったり

機能の粒度が小さい

必要な機能だけを組み合わせて使える

• (無駄がない)

ほしい機能を作るためには,関連する関数を 適切に組み合わせないといけない

8

Page 9: OpenCVをAndroidで動かしてみた

OpenCVの特徴

ドキュメントが全体的に不足

リファレンスに行間が多すぎ

リファレンス化されていない関数も多い

• マイナー言語の場合は,C/C++言語向けの内容と ソースコードを見比べながら試行錯誤…

9

面倒ごともありますが,ベタな実装と比較すれば

画像処理プログラミングが かなり楽になります!

Page 10: OpenCVをAndroidで動かしてみた

Android 版 OpenCV

Page 11: OpenCVをAndroidで動かしてみた

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

Page 12: OpenCVをAndroidで動かしてみた

Android版を使う上でまず考えること

どちらのAPIを使うか

① Java APIを使う

② C++ APIを使う (NDK)

③ ハイブリッド(①+②)

カメラ画像をどのように取得するか

① Android のカメラ機能

② OpenCV のカメラ機能

⇒ それぞれ,以降のページで説明します

12

Page 13: OpenCVをAndroidで動かしてみた

Java API for Android

特徴

Java上で実装・ビルドする。

• NDKは不要

API呼び出し時のオーバーヘッドが大きい

• API内部の処理はNDKでビルド済のため変わらないハズ

デバッグは楽

PC版とAPI仕様が 異なる

13

SurfaceView

行わせたい画像処理 in Java

Java API (OpenCV)

Native Library (OpenCV) OpenCV for Android

オーバーヘッド大

Page 14: OpenCVを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++

Page 15: OpenCVをAndroidで動かしてみた

Androidのカメラ機能を使う場合

Android OSのカメラ 機能を用いてyuv形式で取得したのち,OpenCVのMat型に 変換する。

OS標準のAPIを用いるため,機種 依存性が小

少し遅いかも

15

SampleViewBase

SurfaceView

Sample1View

Activity

Sample1Java

Mat型変数(mYuv)にカメラ画像のByte配列を格納

SurfaceViewに描画するため, Mat型からBitmapを生成して戻る

Page 16: OpenCVをAndroidで動かしてみた

OpenCVのカメラ機能を使う場合

OpenCVのカメラ画像 取得API(highgui.VideoCaputure)

を用いて画像データを取得する。

機種依存性が高い

処理が軽いかも

16

SampleCvViewBase

SurfaceView

Sample2View

Activity

Sample2View

VideoCapture.retreive で直接Mat 型変数にカメラ画像を取得。

SurfaceViewに描画するため, Mat型からBitmapを生成して戻る

Page 17: OpenCVをAndroidで動かしてみた

リファレンス情報(1/2)

http://opencv.jp/ 日本語のリファレンスが存在する

• REFERENCE MANUAL → C++リファレンス

• COOKBOOK [おすすめ]

少し情報が古い(Ver2.2相当)

Java版が無いので、C++版から読み替えが必要

http://opencv.itseez.com/modules/refman.html 英語だが最新リファレンス(Ver2.3相当)

JavaAPIの記述がないので読み替えが必要

17

Page 18: OpenCVをAndroidで動かしてみた

リファレンス情報(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

Page 19: OpenCVをAndroidで動かしてみた

Androidで実装するときのTIPS

まずはPC版OpenCVでアルゴリズムを検討し、その後Androidに移植すると良さそう。

OpenCVのライブラリサイズが大きい(5MB強)ため、 デバッグ時の転送&展開に時間がかかる。

JavaAPIの情報が少ないため、想定通りに動かない場合の切り分けが難しい。

端末によってカメラの解像度や写りの質・CPU速度などが異なるため、一様には 動作してくれないことにも注意する。

19

Page 20: OpenCVをAndroidで動かしてみた

Android版OpenCVの実装例

20

Page 21: OpenCVをAndroidで動かしてみた

ドロイドくん追跡カー@KOF2011

11/11~12に開催されたKOF2011 (関西オープンフォーラム) に動態展示しました

Page 22: OpenCVをAndroidで動かしてみた

全体処理の流れ

内蔵カメラ

Androidケータイ

ドロイドくん

Arduino

ギアボックス

②左右モーターの 回転速度と 駆動時間を指令

①OpenCVで ドロイドくんの 位置を検出

http://ja.wikipedia.org/wiki/Arduino , http://www.tamiya.com/japan/products/70168double_gearbox/index.htm

Page 23: OpenCVをAndroidで動かしてみた

①画像処理

緑色の領域を抽出し,サイズが最も大きな 領域をドロイド君人形と認識させる。

23

カメラ画像を取得

RGB→HSV変換

色相,彩度,輝度で制限をかける

ノイズ除去

領域に分割

最大の領域を 見つける

モータ制御値を 生成(&送信)

“色”で分離しやすい指標に変換

緑色のピクセルだけにマークをつける

抽出領域の中心が 画面中央に来るように

(色相)

(彩度)

(輝度)

Page 24: OpenCVをAndroidで動かしてみた

ソースコード(画像取得,色抽出,領域分割)

24

Page 25: OpenCVをAndroidで動かしてみた

ソースコード(最大領域の探索)

25

Page 26: OpenCVをAndroidで動かしてみた

②モーターを動かす

26

Arduino (マイコン基板)

Android端末

USBホストシールド

モータードライバ シールド

タミヤモーター

USB

PWM M

icro

bri

dge

OpenCV

画像追跡ソフト

モーター制御ソフト

PW

M

【ハード構成】 【ソフト構成】

回転方向の選択と, 電力増幅 (約500円)

通信ソケットのようなものを 張ってくれます

今回は,左右モーターの回転時間と回転速度を指令(Down方向のみ)

指令された回転時間・速度になるように,PWMを生成

Page 27: OpenCVをAndroidで動かしてみた

ソースコード(指令値の生成と送信)

27

バイト配列をsendすれば

Page 28: OpenCVをAndroidで動かしてみた

ソースコード(Arduino)

28

初期化処理

データ受信時の イベントハンドラ

バイト配列として 受信データを読み出せる

Page 29: OpenCVをAndroidで動かしてみた

実機デモ

デモ

29

Page 30: OpenCVをAndroidで動かしてみた

まとめ

30 特別出演:あり太君 http://twitter.com/shokokanko

和歌山県は

近畿地方です!

Page 31: OpenCVをAndroidで動かしてみた

まとめ <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

Page 32: OpenCVをAndroidで動かしてみた

Thank you!