今回は いかにもComputerVisionらしいテーマです。
OpenCv for Android では種々の画像を学習した結果が
OpenCV-2.3.1shareOpenCVhaarcascades に提供されています。
顔の検出には haarcascade_frontalface_alt.xml を使います。haarcascades内のその他のファイルの用途は、ファイル名からなんとなく類推はできますが、はっきりしたことは いまのところ良くわかりません。
検出には CascadeClassifierクラスのdetectMultiScaleメソッドを用います。
void detectMultiScale(Mat image, java.util.List objects, double scaleFactor, int minNeighbors, int flags, Size minSize, Size maxSize)
JavaDocを見ると rejectLevels等を指定するもうひとつの形式がありますが、今回は上の形式を扱います。
Mat image : CV_8U 型の行列つまりグレースケール化された画像。ここに格納されている画像中からオブジェクトが検出されます。
java.util.List objects : 矩形を要素とするList。それぞれの矩形の中に検出したオブジェクトを含みます。
double scaleFactor : 各画像スケールにおける縮小量を表します。
int minNeighbors : オブジェクト候補となる矩形は,最低でもこの数だけの近傍矩形を含む必要があります。
この意味を正しくつかむにはグループの概念を理解する必要があるようです。
int flags (省略可) : 処理モード。Objdetectクラスで定義された定数を指定してください。
CASCADE_DO_CANNY_PRUNING・CASCADE_DO_ROUGH_SEARCH
CASCADE_FIND_BIGGEST_OBJECT・CASCADE_SCALE_IMAGE
このパラメータは,新しいカスケードでは利用されません。古いカスケードに対しては,cvHaarDetectObjects 関数の場合と同じ意味を持ちます。
実行した結果ではCASCADE_FIND_BIGGEST_OBJECTが最も大きなオブジェクトのみを検出する以外差は感じませんでした。
Size minSize (省略可) : 検索対象にする矩形の最小値
Size maxSize (省略可) : 検索対象にする矩形の最大値(省略時 入力画像の大きさ)
実行結果 |
入力データ
野田改造内閣(440*450)
コーディング
//グレースケール画像に変換 Mat gray = new Mat(); Imgproc.cvtColor(mat , gray, Imgproc.COLOR_RGB2GRAY); //CascadeClassifier を定義する String cascade_path= Environment.getExternalStorageDirectory()+"/DCIM/100ANDRO/haarcascade_frontalface_alt.xml"; CascadeClassifier cascade = new CascadeClassifier(); cascade.load(cascade_path); //検索結果格納領域 List getlst = new ArrayList(); //検索処理 cascade.detectMultiScale(gray, getlst, 1.1, 2, Objdetect.CASCADE_SCALE_IMAGE); //検索結果表示処理 for (int i=0; i < getlst.size(); i++){ Rect rct = getlst.get(i); Point pt1 = new Point(rct.x,rct.y); Point pt2 = new Point(rct.x + rct.width, rct.y + rct.height); Core.rectangle(mat, pt1, pt2, new Scalar(255,255,255), 2); }
出力結果 お見事!!
by Android2.2 with OpenCv 2.3.1 for Android |