AndroidでOpenCV 画像から青色を検出する

Androidのカメラ画像から青色を検出します。

このブログを参考にしました。
アンドロイドでOpenCV:色検出

実装はこんな感じ。

// 青色を抽出
Imgproc.cvtColor(tempMat, tempMat, Imgproc.COLOR_RGBA2BGR);
Imgproc.cvtColor(tempMat, tempMat, Imgproc.COLOR_BGR2HSV);
Core.inRange(tempMat, new Scalar(90, 70, 70), new Scalar(110, 255, 255), tempMat);
Imgproc.cvtColor(tempMat, tempMat, Imgproc.COLOR_GRAY2BGRA);

他の色を抽出したいときの設定はこんな感じのようです。

// 赤色
Core.inRange(tempMat, new Scalar(0, 100, 30), new Scalar(5, 255, 255), tempMat);
// 緑色
Core.inRange(tempMat, new Scalar(50, 50, 50), new Scalar(80, 255, 255), tempMat);
// 黄色
Core.inRange(tempMat, new Scalar(20, 50, 50), new Scalar(40, 255, 255), tempMat);
// 肌色
Core.inRange(tempMat, new Scalar(0, 38, 89), new Scalar(20, 192, 243), tempMat);

色の抽出にはHSV形式が良いらしいです。この色の抽出が結構大変でした。RGBAから直接HSVに変換はできないらしく、RGBA→BGR→HSVとする必要があります。またinRangeの出力はGRAYなので適宜変換してください。ここでは色を抽出した後はGRAY→GBRAとしています。このことがわかるのにかなり時間を要しました。どれか一つでも抜けると出力画像がおかしくなったり、アプリ起動中に落ちたりします。

実際の入出力画像を示します。
入力画像(カメラ画像)

出力画像(青色を白に他を黒とした画像)