Web Analytics

こつこつエンジニア

現役アプリ開発者によるIT系特化ブログ

【VS(C#)+OpenCV(C++)】画像ファイルから顔認識してみる

f:id:madai21:20211014185413j:plain

はじめに

OpenCVの物体検出機能を使用して、人の顔の特徴量を機械学習させた「カスケード分類器」を用い静止画像から人の顔を認識させてみたいと思います。

環境

この記事で作成したVisualStudio2019+OpenCV4のプロジェクトがあることを前提に進めます。
madai21.hatenablog.com

手順

  1. カスケード分類器をダウンロード
  2. C++/CLI(OpenCVラッパー)プロジェクトの編集
  3. C#コンソールアプリプロジェクトの編集
  4. 顔認識を実施
  5. おまけ

1. カスケード分類器をダウンロード

以下の場所からカスケード分類器をダウンロードします。
github.com
ダウンロードしたopencv-master.zipを解凍してopencv-master\dataをC:\opencv\に置きます。

2. C++/CLI(OpenCVラッパー)プロジェクトの編集

OpenCVWrapper.hを開いて以下の内容に編集します。

#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <msclr/marshal_cppstd.h>
#include <vector>
 
using namespace System;
using namespace msclr::interop;
 
namespace OpenCVWrapper {
	public ref class OpenCVWrapperCls
	{
	public:
		static void DetectFace(System::String^ filePath)
		{
			cv::CascadeClassifier cc("C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
			auto mat = cv::imread(marshal_as<std::string>(filePath));
			std::vector<cv::Rect> faces;
			cc.detectMultiScale(mat, faces);
			for (int i = 0; i < faces.size(); i++) {
				rectangle(mat, 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, 0, 255), 3, CV_AA);
			}
			cv::imshow("Detect Face Result Window", mat);
			while (1)
			{
				auto key = cv::waitKey(1);
				if (key == 27) {
					break;
				}
			}
			cv::destroyAllWindows();
		}
	};
}

3. C#コンソールアプリプロジェクトの編集

Program.csを開いて以下の内容に編集します。
"target.jpg"のところには検出したい静止画のファイルパスを設定します。

using System;
 
namespace OpenCVConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            OpenCVWrapper.OpenCVWrapperCls.DetectFace("target.jpg");
        }
    }
}

4. 顔認識を実施

F5を押してビルドと実行を行います。
このように人の顔の周りに赤枠が出れば顔認識できています^^
f:id:madai21:20210714203330p:plain
複数人でもうまく認識してくれていますね。
f:id:madai21:20210714203459p:plain

5. おまけ

さらに人だけではなく猫ちゃんを認識させてみましょう。
人と猫ちゃんが写っているこんな静止画を用意します。
f:id:madai21:20210714203542j:plain
まずはそのままこの画像を顔認識させてみましょう。
人だけ赤枠出て、猫ちゃんには赤枠出ていないですね。
f:id:madai21:20210714203654p:plain

今使っているカスケード分類器は人の顔用なので、猫用のカスケード分類器に差しかえましょう。
以下の場所からカスケード分類器をダウンロードできるみたいですので使わせて貰いましょう^^
github.com
ダウンロードしたcat-fancier-master.zipを解凍してcat-fancier-master\detector\models\catをC:\opencv\dataに置きます。

先ほど設定したOpenCVWrapper.hの

cv::CascadeClassifier cc("C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml");

cv::CascadeClassifier cc("C:\\opencv\\data\\cat\\cascade_24x24.xml");

に変えてF5を押してビルドと実行を行いましょう。
f:id:madai21:20210714204417p:plain
ちゃんと猫ちゃんの顔を認識してくれましたね^^w

おわりに

いかがでしたでしょうか?
OpenCVを使えば簡単に顔認識できましたね^^

今回以下のサイトを参考にさせていただきました^^
感謝です^^w
qiita.com
qiita.com
素材は写真ACさんを利用させて頂いてます^^
いつも無料で使わせて頂き大変助かります^^w
www.photo-ac.com