catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

OpenCV for Android のサンプルプログラム解析

 

OpenCVのサンプルコードを解析して、動作を確認した。

 

解析手順は2段階で実施した。
今回、まずは全体の動作を確認する。
インターフェイスとクラスのマニュアル確認が目的。

 

CvCameraViewListener2インターフェイスの仕様確認

 

サンプルプログラム「ImageManipulationsActivity.java」は、CameraBridgeViewBase.CvCameraViewListener2インターフェイスを実装している。このインターフェイスのメソッドは次の3個。

onCameraFrame()
フレームの配信が行われる必要があるときに呼び出される。

onCameraViewStarted()
カメラのプレビューが開始されたときに呼び出される。

OnCameraViewStopped()
カメラのプレビューを停止されたときに呼び出される。


今回もっとも重要なコードが含まれるメソッドonCameraFrame()は、
引数は
CvCameraViewFrame、戻り値がMat型である。
CvCameraViewFrame
rgba()gray()の2個のメソッドのみを持つ。
この2つのメソッドの戻り値はMat型である。

つまり、何もエフェクトをかけないのならば、CvCameraViewFrame.rgbg()をそのまま返してしまえばよい。

 

Mat型の概要

 

Mat型はOpenCVでは重要な型である。
誤解を恐れずに書くならば、
・行列のような形式で表現されるマトリクス
・マトリクスの各要素は複数のチャンネルを持てる。(グレースケールなら1チャンネル。RGBAなら4チャンネル。)
・行列の次元はDim(Dimensionの略?)で表現する。まずは2次元画像を扱うのが目的なので当面は気にしなくてよさそう?

といったところか。詳細はリファレンスマニュアルを参照。
ここまでがAndroid上でカメラ画像に対してOpenCVを使ってエフェクトをかけるための基本的な情報。

 

サンプルプログラム固有の実装

 

サンプルプログラム「ImageManipulationsActivity.java」では次のように実装している。
onCameraViewStartedで必要なリソースを確保
onCameraFrameで入力画像にエフェクトをかける。
onCameraViewStoppedで不要になったリソースを解放。

こんな感じで、しくみは非常に簡単。
JavaAndroidの勉強を兼ねて、少しづつ進めていこう。
情報を整理して書き出すと、まだまだ勉強不足だと感じる。