OpenCV 物体検出、分類器作成と検出テスト その1 

OpenCVを使った物体検出の分類器作成をしたので、その手順や所感をまとめてみました。

物体を検出させるにはカスケード分類器を作成します。
カスケード分類器はポジティブ画像(正解画像)とネガティブ画像(不正解画像)から特徴を抽出して、機械学習によって作成されます。そして、作成された分類器を使用することで簡単に物体検出ができます。勿論きちんと学習できていないと精度は期待できませんが。。

さて、公開されている分類器があるので、まずはそれを使って顔や体の検出を試してみます。

まず顔の分類器(haarcascade_frontalcatface.xml)で確認。
検出にはOpenCVのAPI、detectMultiScaleを使います。


そこそこいい感じですね。
パラメータは全てデフォルトなので、多少調整してみます。
ここでは、minNeighborsをデフォルト値の3から10に変更してみます。


誤検出は減りましたが、正しく検出されていた顔も検出されなくなりました。
こういった検出精度のパラメータはトレードオフなので設定が難しいところです。

 

C#ソースコード/フォームアプリ/PictureBoxを配置/OpenCvSharp3

Mat originalMat = new Mat(“./img/img2.jpg”);
CascadeClassifier fil = new CascadeClassifier(“./cascade/haarcascade_frontalface_default.xml”);

// グレー変換
Mat gray = new Mat();
Cv2.CvtColor(originalMat, gray, ColorConversionCodes.BGR2GRAY);

// 検出
Rect[] rects;
rects = fil.DetectMultiScale(gray, 1.1, 10);

// 枠描画
foreach (Rect rc in rects)
{
originalMat.Rectangle(rc, new Scalar(0, 0, 255), 2);
}

Bitmap bmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(originalMat);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(bmp, 0, 0);

g.Dispose();

pictureBox1.Image = bmp;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です