OpenCVに標準で用意されているHaar CascadeClassFilterを用いてWebカメラの映像から顔のトラッキングを試してみた。
環境
OS: Windows 10
Webカメラ: Logicool HD Webcam C525
開発環境: Visual Studio 2019(ver 16.2.3)
ライブラリ: OpenCV(4.1.1)
言語: C++
OpenCVをVisual Stdio 2019で使う準備
VS2019上でOpenCVを使うための事前準備。
導入済みの方は飛ばしてください。
まずは環境変数に以下のディレクトリをPathに追加する(OpenCVをCドライブ直下に展開した場合。以下、OpenCVのパスは各自環境に合わせてください)。
「C:\opencv\build\bin」
Visual Studio 2019を起動し、空のプロジェクトを作る。
メニューより「プロジェクト(P) > プロパティ」から、プロパティページを開く。
次の項目を変更する。
「構成プロパティ > VC++ディレクトリ > インクルードディレクトリ」に以下を追加
C:\opencv\build\include
「構成プロパティ > VC++ディレクトリ > ライブラリディレクトリ」に以下を追加
C:\opencv\build\x64\vc15\lib
「構成プロパティ > リンカー > 入力 > 追加の依存ファイル」に以下を追加
opencv_world411d.lib
環境構築は以上。
参考:
OpenCV(4.1.0) + Visual Studio 2019の設定忘備録 – Qiita @kenjiSpecial@github
OpenCV 4.1.1をVisual Studio 2019から使用する時の手順 – Qiita @h-adachi
カスケードフィルタ実装
OpenCVが提供している顔認識用のカスケードフィルタを使用して、リアルタイムのフェイストラッキングを実装する。
カスケードファイルの場所は以下の通り。
C:\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml
Windowsのパスは記述が面倒なので、使用するカスケードファイルをプロジェクトファイルのあるディレクトリにコピーする。
今回はfilterというフォルダを作り、その中にカスケードファイルを配置した。
顔検出のソースコードは以下の通り。
(参考: OpenCV: Cascade Classifier)
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
CascadeClassifier face_cascade;
// カスケードフィルタの場所を指定
if(!face_cascade.load("./filter/haarcascade_frontalface_alt.xml"))
{
cout << "--(!)Error loading face cascade\n";
return -1;
};
vector<Rect> faces;
// ビデオデバイスを選択
VideoCapture capture(0);
if (!capture.isOpened())
{
cout << "--(!)Error opening video capture\n";
return -1;
}
Mat frame;
while (capture.read(frame))
{
capture >> frame;
face_cascade.detectMultiScale(frame, faces, 1.1, 3, 0, Size(20, 20));
// 検知対象を矩形表示
for (int i = 0; i < faces.size(); i++)
{
rectangle(frame, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 3, 16);
}
imshow("Capture - Face detection", frame);
// escape押下でループ終了
if (waitKey(10) == 27)
{
break;
}
}
destroyAllWindows();
return 0;
}
Github – suminoame/opencv_haar_tutorial
そこそこ良い精度で追従するが、顔が少しでも傾くと検知しなくなる(正面の顔を検出するフィルタであるため)。
今回使用したフィルタ以外にも、様々なカスケードファイルが公開されているので色々試してみよう。
(参考:「顔以外」のものを画像認識する on iOS ‐ Qiita@shu223)
深層学習を用いたトラッキングも試したい。