SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
日本Androidの会 京都支部
                      第3回 勉強会
                       (2011-12-03)

     OpenCV を
Android で動かしてみた



      Toru UENOYAMA
  @ 日本Androidの会 京都支部
自己紹介
   名前
       上野山 徹 (うえのやま とおる)
       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を使用



   一部の画像処理検査装置
   研究機関でのアルゴリズム評価ソフト

                  http://en.wikipedia.org/wiki/DARPA_Grand_Challenge
                  http://www.cengen.com/content/darpa-grand-challenge-2004
                                                                             6
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
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でビルド済のため変わらないハズ
     デバッグは楽                        SurfaceView

     PC版とAPI仕様が
      異なる                    行わせたい画像処理 in Java

            オーバーヘッド大

                                  Java API (OpenCV)
         OpenCV for Android
                                Native Library (OpenCV)
                                                          13
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
Androidのカメラ機能を使う場合
   Android OSのカメラ    SurfaceView        Activity

    機能を用いてyuv形式
    で取得したのち,         SampleViewBase

    OpenCVのMat型に
    変換する。            Sample1View       Sample1Java

   OS標準のAPIを用いる
    ため,機種
    依存性が小             Mat型変数(mYuv)にカメラ画像のByte配列を格納


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

                                                     15
OpenCVのカメラ機能を使う場合
   OpenCVのカメラ画像                 SurfaceView            Activity

    取得API(highgui.VideoCaputure)
    を用いて画像データを SampleCvViewBase
    取得する。
                                  Sample2View         Sample2View


   機種依存性が高い

                                    VideoCapture.retreive で直接Mat
   処理が軽いかも                         型変数にカメラ画像を取得。




                                          SurfaceViewに描画するため,
                                          Mat型からBitmapを生成して戻る
                                                                    16
リファレンス情報(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の生成方法
        > javadoc –help
        > cd <ソース解凍先>¥OpenCV-2.3.1
        > javadoc -sourcepath src -d javadoc -subpackages org.opencv


   『詳解 OpenCV』(オライリー社)
       画像処理アルゴリズムの考え方も含め
        丁寧に記述されている
       C API (≠C++) のため読み替えがさらに大変
                                                                       18
Androidで実装するときのTIPS
   まずはPC版OpenCVでアルゴリズムを検討し、
    その後Androidに移植すると良さそう。
     OpenCVのライブラリサイズが大きい(5MB強)ため、
      デバッグ時の転送&展開に時間がかかる。
     JavaAPIの情報が少ないため、想定通りに動かな
      い場合の切り分けが難しい。


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

                                19
Android版OpenCVの実装例




                     20
ドロイドくん追跡カー@KOF2011
11/11~12に開催されたKOF2011
(関西オープンフォーラム) に動態展示しました
全体処理の流れ
 ドロイドくん                                                                           ギアボックス




                                    ②左右モーターの
            内蔵カメラ                    回転速度と
                                     駆動時間を指令




            ①OpenCVで
             ドロイドくんの
Androidケータイ  位置を検出                                                                            Arduino

    http://ja.wikipedia.org/wiki/Arduino , http://www.tamiya.com/japan/products/70168double_gearbox/index.htm
①画像処理
   緑色の領域を抽出し,サイズが最も大きな
    領域をドロイド君人形と認識させる。
    カメラ画像を取得     “色”で分離しやすい
                    指標に変換     (色相)
     RGB→HSV変換
                              (彩度)
    色相,彩度,輝度
                 緑色のピクセルだけ
     で制限をかける      にマークをつける    (輝度)


     ノイズ除去

     領域に分割

     最大の領域を
      見つける
    モータ制御値を       抽出領域の中心が
     生成(&送信)     画面中央に来るように
                                23
ソースコード(画像取得,色抽出,領域分割)




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




                  25
②モーターを動かす
          【ハード構成】      【ソフト構成】

                       画像追跡ソフト
          Android端末
                                      OpenCV




                        Microbridge
                                      通信ソケットのようなものを
                USB                   張ってくれます
                                      今回は,左右モーターの回転
          USBホストシールド
                                      時間と回転速度を指令
                                      (Down方向のみ)
           Arduino
          (マイコン基板)     モーター制御ソフト

回転方向の     モータードライバ
選択と,        シールド                      指令された回転時間・速度に
電力増幅                    PWM           なるように,PWMを生成
(約500円)        PWM
          タミヤモーター

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




    バイト配列をsendすれば




                    27
ソースコード(Arduino)

     バイト配列として       データ受信時の
     受信データを読み出せる
                   イベントハンドラ


                              初期化処理




                                      28
実機デモ




       デモ
            29
まとめ



       和歌山県は
      近畿地方です!

                                          30
特別出演:あり太君 http://twitter.com/shokokanko
まとめ <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
Thank you!

Mais conteúdo relacionado

Mais procurados

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

Mais procurados (20)

ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
 
20171005 告白に学ぶ http status code
20171005 告白に学ぶ http status code20171005 告白に学ぶ http status code
20171005 告白に学ぶ http status code
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 

Destaque

Destaque (20)

OpenCV 3.0 on iOS
OpenCV 3.0 on iOSOpenCV 3.0 on iOS
OpenCV 3.0 on iOS
 
OpenCVの基礎
OpenCVの基礎OpenCVの基礎
OpenCVの基礎
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
 
Deflate
DeflateDeflate
Deflate
 
単一物体追跡論文のサーベイ
単一物体追跡論文のサーベイ単一物体追跡論文のサーベイ
単一物体追跡論文のサーベイ
 
Deep learningの軽い紹介
Deep learningの軽い紹介Deep learningの軽い紹介
Deep learningの軽い紹介
 
FPGAって、何?
FPGAって、何?FPGAって、何?
FPGAって、何?
 
勉強会資料 Distribution
勉強会資料 Distribution勉強会資料 Distribution
勉強会資料 Distribution
 
Compact ordered dict__k_lab_meeting_
Compact ordered dict__k_lab_meeting_Compact ordered dict__k_lab_meeting_
Compact ordered dict__k_lab_meeting_
 
Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法Golangにおける端末制御 リッチなターミナルUIの実現方法
Golangにおける端末制御 リッチなターミナルUIの実現方法
 
ARもVRもMRもまとめてドーン
ARもVRもMRもまとめてドーンARもVRもMRもまとめてドーン
ARもVRもMRもまとめてドーン
 
センサー・VR・MR 基本とオススメ
センサー・VR・MR 基本とオススメセンサー・VR・MR 基本とオススメ
センサー・VR・MR 基本とオススメ
 
悪意ないユーザに配慮した不正クライアントの排除
悪意ないユーザに配慮した不正クライアントの排除悪意ないユーザに配慮した不正クライアントの排除
悪意ないユーザに配慮した不正クライアントの排除
 
負荷試験、どうしてる?(公開版)
負荷試験、どうしてる?(公開版)負荷試験、どうしてる?(公開版)
負荷試験、どうしてる?(公開版)
 
Raspberry piと.net coreのstandardな関係
Raspberry piと.net coreのstandardな関係Raspberry piと.net coreのstandardな関係
Raspberry piと.net coreのstandardな関係
 
MS COCO Dataset Introduction
MS COCO Dataset IntroductionMS COCO Dataset Introduction
MS COCO Dataset Introduction
 
ARもVRもMRもまとめてドドンドーン!
ARもVRもMRもまとめてドドンドーン!ARもVRもMRもまとめてドドンドーン!
ARもVRもMRもまとめてドドンドーン!
 
Pythonによる機械学習入門 ~Deep Learningに挑戦~
Pythonによる機械学習入門 ~Deep Learningに挑戦~Pythonによる機械学習入門 ~Deep Learningに挑戦~
Pythonによる機械学習入門 ~Deep Learningに挑戦~
 
一般向けのDeep Learning
一般向けのDeep Learning一般向けのDeep Learning
一般向けのDeep Learning
 

Semelhante a OpenCVをAndroidで動かしてみた

OpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメOpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメ
Masaki Otsuki
 
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
Developers Summit
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
NilOne Ltd.
 
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
Ryosuke MATSUMOTO
 
PHP on Windows Azure
PHP on Windows AzurePHP on Windows Azure
PHP on Windows Azure
Microsoft
 
Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)
masanori kataoka
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
Naruto TAKAHASHI
 

Semelhante a OpenCVをAndroidで動かしてみた (20)

OpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメOpenCV4Androidで画像処理アプリのススメ
OpenCV4Androidで画像処理アプリのススメ
 
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
 
01 idea table3.1(up)
01 idea table3.1(up)01 idea table3.1(up)
01 idea table3.1(up)
 
静的解析ツール Klocworkによる 機能安全規格への対応
静的解析ツール Klocworkによる 機能安全規格への対応静的解析ツール Klocworkによる 機能安全規格への対応
静的解析ツール Klocworkによる 機能安全規格への対応
 
01 idea table3.2
01 idea table3.201 idea table3.2
01 idea table3.2
 
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
 
ロボット用Open Source Software
ロボット用Open Source Softwareロボット用Open Source Software
ロボット用Open Source Software
 
PHP on Windows Azure
PHP on Windows AzurePHP on Windows Azure
PHP on Windows Azure
 
PHP on Windows Azure
PHP on Windows AzurePHP on Windows Azure
PHP on Windows Azure
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
 
Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
組込みAndroid入門実習
組込みAndroid入門実習組込みAndroid入門実習
組込みAndroid入門実習
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
 
Android0422
Android0422Android0422
Android0422
 

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
  • 27. ソースコード(指令値の生成と送信) バイト配列をsendすれば 27
  • 28. ソースコード(Arduino) バイト配列として データ受信時の 受信データを読み出せる イベントハンドラ 初期化処理 28
  • 29. 実機デモ デモ 29
  • 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