2017.01.23
gon

Androidでビデオ映像のエッジ処理

3流プログラマ脱却のため出来ることを一つ増やしてみようと思いAndroidでビデオ映像のエッジ処理に挑戦してみました
全く触りの知識も無く何のライブラリが主流なの?ってところから始めましたので、社内への相談を兼ねてその途中経過を
まずわかったのが、
・OpenCVとかOpenGL|ESというライブラリを使えば良い
・エッジ処理を行うには毎フレームこれらの処理を行う必要がある

  • RGB→グレースケールへ変換
  • 明確な境界があるものだけどエッジ処理させるためのブラー処理
  • エッジ処理

OpenCVのチュートリアルを元にビデオ映像をリアルタイムでエッジ&ブラー処理を動かすのに簡単そうなのを試してみたのですが
・映像処理無しで1920×1080の解像度だと28-31FPSで動いた
・エッジ&ブラー処理を行って解像度が1024×768であれば10FPSで動く
・エッジ&ブラー処理を行って解像度が1920×1080だと2-3FPSしか出ない、そしてXperia Z3が熱暴走して止まるかOOM発生して停止
・エッジ処理のみを行って解像度が1920×1080だと15FPSで動く
ブラー処理に負荷がかかりJavaのみだとこの程度らしく、円滑に処理を行うには負荷のかかる処理にはJNIを利用してC/C++のネイティブコードで記述すると良いという事を知ったので
OpenCVで紹介されているOpenCLが非常に画期的に思えチュートリアルを途中までやってみたところ、OpenCLで作成されたプログラムを様々なメーカーのデバイスで利用するにはKhronos Groupが提供しているOpenCL用のライセンス($15000)を買うか、各SoCが提供しているSDKを取得してSoC別に処理をさせないと、QualcommとMediaTekは動いてもSAMSUNGの端末では例外が発生する!のような状態になる可能性が高いんじゃないかと思えてきて、買えないし色々考えるの面倒臭いしで断念
それならOpenGL|ESとJNI使おうという事でまず2Dのレンダリング処理をやってみて、これは日本語の情報も書籍もあったので比較的早く動かすってことまでは出来たが
ビデオ画像をリアルタイムで画像処理させるには、FrameBufferObject(FBO)という技術を利用して複数のテクスチャを用意してやらないといけないらしい(よく見たらOpenCLのコードもそうなってた)
khronos Groupが紹介しているFBOの例を参考にやってみたところ、Androidでの旧CameraAPIでは出来たがCamera2APIだとコールバック色々あってどのタイミングでどのクラスのコールバックをFBOに渡せばいいの?って状態に
そしてFBO出来たと言っても処理処理挟む事はまだ出来ていないので、動くけど中途半端….
書籍であるかなぁと思って色々検索してみたのですが、旧CameraAPIとOpenGL|ESで実装する本はあっても、Camera2APIでOpenGL|ES+FBO使って画像処理させるような日本語の書籍は発売されてなくて参考にするものが無いので停滞中です。
とりあえず動く!って状態は自力で出来ると思うんですが、ちゃんと理解した!って事とは違うので解る方居たら教えてください
gon

一覧に戻る