【VS(C#)+OpenCV(C++)】画像ファイルから顔認識してみる
- はじめに
- 環境
- 手順
- 1. カスケード分類器をダウンロード
- 2. C++/CLI(OpenCVラッパー)プロジェクトの編集
- 3. C#コンソールアプリプロジェクトの編集
- 4. 顔認識を実施
- 5. おまけ
- おわりに
環境
この記事で作成したVisualStudio2019+OpenCV4のプロジェクトがあることを前提に進めます。
madai21.hatenablog.com
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を押してビルドと実行を行います。
このように人の顔の周りに赤枠が出れば顔認識できています^^
複数人でもうまく認識してくれていますね。
5. おまけ
さらに人だけではなく猫ちゃんを認識させてみましょう。
人と猫ちゃんが写っているこんな静止画を用意します。
まずはそのままこの画像を顔認識させてみましょう。
人だけ赤枠出て、猫ちゃんには赤枠出ていないですね。
今使っているカスケード分類器は人の顔用なので、猫用のカスケード分類器に差しかえましょう。
以下の場所からカスケード分類器をダウンロードできるみたいですので使わせて貰いましょう^^
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を押してビルドと実行を行いましょう。
ちゃんと猫ちゃんの顔を認識してくれましたね^^w
おわりに
いかがでしたでしょうか?
OpenCVを使えば簡単に顔認識できましたね^^
今回以下のサイトを参考にさせていただきました^^
感謝です^^w
qiita.com
qiita.com
素材は写真ACさんを利用させて頂いてます^^
いつも無料で使わせて頂き大変助かります^^w
www.photo-ac.com