OpenCVをAndroidで動かしてみた

39,322 views

Published on

Published in: Technology
0 Comments
23 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
39,322
On SlideShare
0
From Embeds
0
Number of Embeds
15,032
Actions
Shares
0
Downloads
84
Comments
0
Likes
23
Embeds 0
No embeds

No notes for slide

OpenCVをAndroidで動かしてみた

  1. 1. 日本Androidの会 京都支部 第3回 勉強会 (2011-12-03) OpenCV をAndroid で動かしてみた Toru UENOYAMA @ 日本Androidの会 京都支部
  2. 2. 自己紹介 名前  上野山 徹 (うえのやま とおる)  Google+ : Toru UENOYAMA 出身  和歌山県 • みかん と 梅干し と タチウオ と カレー で有名 和歌山県 仕事  京都の電機メーカーで (組み込み + 画像処理)/2なソフト開発してます
  3. 3. What’s OpenCV ?
  4. 4. OpenCVとは  オープンソースの画像処理ライブラリ  コンピュータビジョンに関する 数多くの機能を提供する  最新研究の画像処理技術やGPGPUにも対応  言語インターフェイス • 元はC言語向け • 今では C++, Python, Ruby, Java などなど  対応OS • Windows, MacOS, Linux, FreeBSD, iOS, Android など ホビーユースから学術研究用途まで 幅広く使える画像処理ライブラリです! 4
  5. 5. OpenCVの機能各種フィルタなど 幾何表現や 汎用画像処理 画像特徴量 複数カメラで領域分割・切出し の三次元復元色変換・形状変換 フィッティング機械学習,形状認識,顔検出 移動物体の追跡 http://opencv.willowgarage.com/wiki/ 5
  6. 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. 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. 8. OpenCVの特徴 実装機能が豊富  画像処理に関することはほぼ網羅されている • 新機能もどんどん追加されている  豊富すぎて必要な機能を探すのが大変だったり 機能の粒度が小さい  必要な機能だけを組み合わせて使える • (無駄がない)  ほしい機能を作るためには,関連する関数を 適切に組み合わせないといけない 8
  9. 9. OpenCVの特徴 ドキュメントが全体的に不足  リファレンスに行間が多すぎ  リファレンス化されていない関数も多い • マイナー言語の場合は,C/C++言語向けの内容と ソースコードを見比べながら試行錯誤… 面倒ごともありますが,ベタな実装と比較すれば 画像処理プログラミングが かなり楽になります! 9
  10. 10. Android 版 OpenCV
  11. 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. 12. Android版を使う上でまず考えること どちらのAPIを使うか ① Java APIを使う ② C++ APIを使う (NDK) ③ ハイブリッド(①+②) カメラ画像をどのように取得するか ① Android のカメラ機能 ② OpenCV のカメラ機能 ⇒ それぞれ,以降のページで説明します 12
  13. 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. 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. 15. Androidのカメラ機能を使う場合 Android OSのカメラ SurfaceView Activity 機能を用いてyuv形式 で取得したのち, SampleViewBase OpenCVのMat型に 変換する。 Sample1View Sample1Java OS標準のAPIを用いる ため,機種 依存性が小 Mat型変数(mYuv)にカメラ画像のByte配列を格納 少し遅いかも SurfaceViewに描画するため, Mat型からBitmapを生成して戻る 15
  16. 16. OpenCVのカメラ機能を使う場合 OpenCVのカメラ画像 SurfaceView Activity 取得API(highgui.VideoCaputure) を用いて画像データを SampleCvViewBase 取得する。 Sample2View Sample2View 機種依存性が高い VideoCapture.retreive で直接Mat 処理が軽いかも 型変数にカメラ画像を取得。 SurfaceViewに描画するため, Mat型からBitmapを生成して戻る 16
  17. 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. 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. 19. Androidで実装するときのTIPS まずはPC版OpenCVでアルゴリズムを検討し、 その後Androidに移植すると良さそう。  OpenCVのライブラリサイズが大きい(5MB強)ため、 デバッグ時の転送&展開に時間がかかる。  JavaAPIの情報が少ないため、想定通りに動かな い場合の切り分けが難しい。 端末によってカメラの解像度や写りの質・ CPU速度などが異なるため、一様には 動作してくれないことにも注意する。 19
  20. 20. Android版OpenCVの実装例 20
  21. 21. ドロイドくん追跡カー@KOF201111/11~12に開催されたKOF2011(関西オープンフォーラム) に動態展示しました
  22. 22. 全体処理の流れ ドロイドくん ギアボックス ②左右モーターの 内蔵カメラ 回転速度と 駆動時間を指令 ①OpenCVで ドロイドくんのAndroidケータイ 位置を検出 Arduino http://ja.wikipedia.org/wiki/Arduino , http://www.tamiya.com/japan/products/70168double_gearbox/index.htm
  23. 23. ①画像処理 緑色の領域を抽出し,サイズが最も大きな 領域をドロイド君人形と認識させる。 カメラ画像を取得 “色”で分離しやすい 指標に変換 (色相) RGB→HSV変換 (彩度) 色相,彩度,輝度 緑色のピクセルだけ で制限をかける にマークをつける (輝度) ノイズ除去 領域に分割 最大の領域を 見つける モータ制御値を 抽出領域の中心が 生成(&送信) 画面中央に来るように 23
  24. 24. ソースコード(画像取得,色抽出,領域分割) 24
  25. 25. ソースコード(最大領域の探索) 25
  26. 26. ②モーターを動かす 【ハード構成】 【ソフト構成】 画像追跡ソフト Android端末 OpenCV Microbridge 通信ソケットのようなものを USB 張ってくれます 今回は,左右モーターの回転 USBホストシールド 時間と回転速度を指令 (Down方向のみ) Arduino (マイコン基板) モーター制御ソフト回転方向の モータードライバ選択と, シールド 指令された回転時間・速度に電力増幅 PWM なるように,PWMを生成(約500円) PWM タミヤモーター 26
  27. 27. ソースコード(指令値の生成と送信) バイト配列をsendすれば 27
  28. 28. ソースコード(Arduino) バイト配列として データ受信時の 受信データを読み出せる イベントハンドラ 初期化処理 28
  29. 29. 実機デモ デモ 29
  30. 30. まとめ 和歌山県は 近畿地方です! 30特別出演:あり太君 http://twitter.com/shokokanko
  31. 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
  32. 32. Thank you!

×