Androidでc++と連携してOpenCVを動かすサンプルプロジェクト解説

wrongwrong163377.hatenablog.com
github.com
こちらの記事で紹介したサンプルプロジェクトの解説記事です。
このプログラムは、以下のページを参考に作成しました。
OpenCV for Android入門 – カメラ編 « Rest Term

プログラムの概要

※このアプリではPermission関連のコードを含めていないため、アプリの実行にはAndroidの設定からカメラのパーミッションを有効にする必要が有ります

このプログラムでは、以下のことをやっています。カッコ内はMainActivity.java内での行数です。

  1. カメラから画像を取り込む(61~)
  2. 取り込んだ画像をrgba形式のMatに変換する(65)
  3. Matをc++のコードに渡し、typeをStringとして受け取り出力(70)
  4. Matをc++のコードに渡し、rgbaの内rを消去(71)
  5. 操作し終わった画像を画面に表示(73)

解説

MatTest1、MatTest2で共通しているのは、longで受け取ったNativeObjAddrからMatを操作している部分です。

Mat &input = *(Mat *) inputAddr;

後はメンバ関数を普通に呼び出しているだけですね。

cv::Mat::type

Mat::typeで帰ってくる値の読み方は以下のページを参考にしました。
ninghang.blogspot.jp
プログラム内のコメントでも少し触れた通り、幾つかの環境で試した結果、MainActivityの65行目のようにrgbaで取得した場合、帰ってくる値は24(CV8UC4)となるようです。
66行目のように、grayでも受け取ることができますが、この場合帰ってくる値は0(CV8UC1)でした。

cv::Mat::forEach

しっかりと理解して書いた訳ではないのですが、ここで利用しているforEach文は、全画素に対してラムダ式の内容を勝手に並列実行してくれるらしいです。