2014年1月17日金曜日

Android-OpenCV 肌色抽出

Android for OpenCV


Androidで取り込んだ画像から肌色を抽出する方法

肌色を抽出するとき色空間がRGBの画像から肌色の範囲を選択してもできますが明るさによって値が大きく変わるのであまり適していません。そこで明るさなどの影響を減らすために色空間をRGBからHSVに変換します。

Imgproc.cvtColor(Mat src, Mat dst, int code)//色空間の変換
src-入力画像、dst-出力画像(入力画像と同じサイズ)、code-変換コード

変換コードのところをRGBからHSVに変換するコードを指定します。

Imgproc.COLOR_RGB2HSV(RGB→HSV)

/*--------------------------------------------------------------------

Mat src;//入力画像
Mat dst;//出力画像
Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV);

---------------------------------------------------------------------*/

これで画像の色空間がHSVに変わりました。

次に肌色の範囲を指定します。

H-色相、S-彩度、V-明度

だいたいHが0~30、Sが60~255、Vが80~255の間の値で肌色になります。
この値を変えることによって肌色を抽出する精度が上がりますが今回はこの値にします。

Core.inRange(Mat src, Scalar lowerb, Scalar upperb, Mat dst)
src-入力画像、lowerb-範囲の下限値、upperb-範囲の上限値、dst-出力画像

今回の場合ScalarはScalar(H、S、V);の順番で指定します。

/*--------------------------------------------------------------------

Mat src;//入力画像
Mat dst;//出力画像
Scalar lowerb = new Scalar( 0,60,80);//下限値
Scalar lowerb = new Scalar(30,255,255);//上限値
Core.inRange( src,  lowerb,  upperb, dst);

---------------------------------------------------------------------*/

これで肌色の部分だけが抽出された画像が出力されます。

0 件のコメント:

コメントを投稿