初めまして、白井です。
OthloTech Advent Calendar 2018の15日目の記事を書いていきます。
OpenCVを使い始めて初歩の初歩の記事なので参考になりません。
あらかじめご了承ください。
今回、Haar特徴ベースのCascade型分類器を使った顔検出を行います。
#環境
- Mac OS Mojave 10.14.1
- OpenCV 3.4.1_5
#手順
以下の手順でやっていきます。
-画像を用意する
-分類機を用意する
-実行
#画像の用意
ぱくたそ
ぱくたそ
ぱくたそさんから二枚の画像を用意しました。
1枚目は正面の顔が写っているもの。
2枚目は横顔が写っているもの。
#分類機の用意
分類機を用意するにあたって自作するには知識が足りず精度が落ちるとのことなので公式が用意している_haarcascade_frontalface_default.xml_を使わせてもらいました。
GitHub
#プログラム
流れはこんな感じです
1 haarcascade_frontalface_default.xmlを読み込み、分類機を作成
2 分類機に画像を指定して顔を検出
3 検出した範囲を矩形で囲む
#include <iostream>
#include <opencv2/opencv.hpp>
#define FILENAME "haarcascade_frontalface_default.xml"
int main(int argc, char const *argv[])
{
//入力画像の読み込み
cv::Mat src_img = cv::imread("画像ファイル");
//出力画像を入力画像からコピー
cv::Mat dst_img = src_img.clone();
cv::CascadeClassifier cascade;
cascade.load(FILENAME);
std::vector<cv::Rect> faces;
// 指定した識別器を用いて画像から顔を検出
cascade.detectMultiScale(dst_img, faces, 1.1, 3, 0, cv::Size(20, 20));
//検出した顔を矩形で囲む
for (int i = 0; i < faces.size(); i++) {
rectangle(dst_img, cv::Point(faces[i].x, faces[i].y), cv::Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), cv::Scalar(0, 200, 0), 3, CV_AA);
}
//入力画像の表示(比較用)
cv::imshow("src", src_img);
//出力画像の表示
cv::imshow("dst", dst_img);
cv::waitKey();
return 0;
}
#実行結果
1枚目はうまく顔を検出することができました。
2枚目は正面からの画像ではなかったため、顔を検出することはできませんでした。
#感想
今回は正面の顔の検出を行なったが、少ないコード量で動かすことができた。今後は横顔にも対応できるような分類機を自作してみようと思った。
また、この記事を書くにあたって初めてのことが多く、とりあえず動けばいいやと思ってコードを書いていたので仕組みももう少し詳しく理解していきたい。
最後に、記事を書く機会を与えてくれてありがとうございました。とてもいい体験をすることができました。今後も自分で情報を発信していこうと思えるきっかけになりました。
#参考文献
ゴリラになる知識