読者です 読者をやめる 読者になる 読者になる

旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【OpenCV】 画像から顔を検出する

C++ OpenCV 画像処理

OpenCVの復習が必要になったのでメモしておきます。

// グレースケールで画像を読み込む
UMat source;
imread("lenna.jpg", CV_LOAD_IMAGE_GRAYSCALE).copyTo(source);
if (source.empty())
{
    throw runtime_error("Failed to open image");
}

// 輝度平滑化を行う
equalizeHist(source, source);

// 顔検出器の作成(xmlはOpenCVをインストールしたフォルダのsources/data/haarcascadesにある)
CascadeClassifier faceDetector("haarcascade_frontalface_alt.xml");
if (faceDetector.empty())
{
    throw runtime_error("Failed to open xml");
}

// 顔を検出する
double scaleFactor = 1.1; // 各スケール毎に画像が縮小される割合
int minNeighbors = 3; // ?
int flag = 0; // 今は使用されていないのでどんな値でも良い
Size minSize = Size(source.cols/4, source.rows/4); // オブジェクトの最小サイズ
Size maxSize = Size(source.cols/1.5, source.rows/1.5); // オブジェクトの最大サイズ
vector<Rect> faces;
faceDetector.detectMultiScale(source, faces, scaleFactor, minNeighbors, flag, minSize, maxSize);

// 検出した顔に目印を付ける
UMat destination = source.clone();
int radius = 8;
Scalar color = Scalar(255, 255, 0);
int thickness = 2;
for (int i = 0; i < faces.size(); ++i)
{
    Point p1 = Point(faces[i].x, faces[i].y);
    Point p2 = Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
    rectangle(destination, p1, p2, color, thickness);
}

imshow("source", source);
imshow("destination", destination);

f:id:ni4muraano:20170115145041j:plain f:id:ni4muraano:20170117110946j:plain

さらに進化した画像処理ライブラリの定番 OpenCV 3基本プログラミング

さらに進化した画像処理ライブラリの定番 OpenCV 3基本プログラミング