2017年4月18日 AndroidでOpenCV画像処理【色抽出編】

前回は、Androidstudioでopencvを使えるようにして、カメラキャプチャまでを行いました。

今回は画像処理の基本的な部分である色変換や指定色のみを抽出するということをやってみようと思います。
今回の目標は、「肌色を抽出して手を表示する」です。

肌色抽出

前回はキャプチャのみでしたが、今回は画像処理の部分を書く必要があります。
今のプログラムではCvCameraViewListenerを使用しているので、
 onCameraViewStarted:処理開始のみ呼ばれる
 onCameraViewStopped:処理終わりにのみ呼ばれる
 onCameraFrame :キャプチャしたら呼ばれる

の3つの関数を使用します。
前回では、onCameraFrameの部分でキャプチャした画像をreturnするプログラムのみを書いています。
今回は、このonCameraFrame関数内に処理を書いていきます。

まず、今回の目的は色抽出ですので色を処理できるようにしないといけません。
キャプチャした画像はRGB形式で取り込まれています。RGBで肌色を表現すると、
 R:252
 G:226
 B:196
になります。しかし、色を指定する際にRGBの3つの値を操作するのは面倒ですし、
赤みがかった肌色、黄色がかった肌色など、閾値の幅を持たせたいときには指定するのが大変です。
通常は色を処理する際はHSV形式に変換します。


HSV形式に変換すると色相(Hue)・彩度(Saturation)・明度(Value)の3つの値が得られます。
opencvで変換する際は、色相は以下の画像のように、0から255の値を持った色になります。
0と255は同じ赤色で、上の画像のようにループしています。

この色相から肌色の幅を指定します。今回は以下のように指定しました。
 上限:35
 下限:0
本当は240~255などの部分も入れたいのですがAnd処理をしないといけないのでやめました。
また、彩度は70~255、明度は90~255と暗く(黒く)なりずぎない明るい部分を指定しました。
肌色抽出した結果のスクリーンショットを下に貼ります。

プログラム

肌色抽出部分のプログラムは以下になります。
また、レイアウトとマニフェスト、画像処理関数以外のメイン文は前回と同じです。

  public Mat onCameraFrame(Mat inputFrame) {
        Mat src = inputFrame;//入力画像
        Mat dst = Mat.zeros(inputFrame.width(),inputFrame.height(),CV_8U);//初期化
        Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);//HSVに変換

        Mat src2 = dst;//HSV画像を代入
        Mat dst2 = Mat.zeros(inputFrame.width(),inputFrame.height(),CV_8U);//初期化
        Scalar low = new Scalar( 0,70,90);//下限(H,S,V)
        Scalar high = new Scalar(35,255,255);//上限(H,S,V)
        Core.inRange( src2,  low,  high , dst2);//肌色抽出

        return dst2;
  }

opencv 関数説明:
 HSV変換 → Imgproc.cvtColor(入力, 出力, Imgproc.COLOR_RGB2HSV);
 肌色抽出 → Core.inRange( 入力画像, 下限値, 上限値 , 出力画像);

次回があれば、ここからノイズを取ったりラベリングして手を抽出してみたいと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。