Tech ,

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


深層学習を用いたトラッキングも試したい。