OpenCVをAndroidで動かしてみた

Preview:

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!

Recommended