OpenCVとWebカメラでリアルタイム顔認識をする

OpenCVとWebカメラでリアルタイム顔認識をする

OpenCVとWebカメラでリアルタイム顔認識をする

今回はOpenCVとWebカメラを使ってリアルタイムで顔認識をしてみます。

今回の構成

・Windows7 64bit
・Webカメラ 「HD ウェブカメラ C270」
・C++
・OpenCV4.0.1
・Visual Studio2017

プロジェクトの用意

Visual Studioを起動して「新規作成」→「プロジェクト」を選択します。「空のプロジェクト」を選択して名前を設定します。今回は「detectFacefromCamera」にします。

ソースの用意

プロジェクトができたら「ソースファイル」を右クリックして「新しい項目の追加」から「detectFacefromCamera.cpp」を追加します。

「detectFacefromCamera.cpp」に以下のソースをまるっとコピーして貼り付けます。パスはカスケードファイルが格納されているところを指定してください。

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <vector>

using namespace cv;
using namespace std;

constexpr auto CV_AA = 16;

int main()
{
	Mat frame; //USBカメラから得た1フレームを格納する場所
	CascadeClassifier cascade; //カスケード分類器格納場所
	cascade.load("C:\\OpenCV4.0.1\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml"); //正面顔情報が入っているカスケード
	vector<Rect> faces; //輪郭情報を格納場所

	VideoCapture cap(0); // USBカメラのオープン
	if (!cap.isOpened()) //カメラが起動できなかった時のエラー処理
	{
		return -1;
	}

	while (1)//無限ループ
	{
		cap >> frame; //USBカメラが得た動画の1フレームを格納
		cascade.detectMultiScale(frame, faces, 1.1, 3, 0, Size(20, 20)); //格納されたフレームに対してカスケードファイルに基づいて顔を検知
		for (int i = 0; i < faces.size(); i++) //検出した顔の個数"faces.size()"分ループを行う
		{
			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, CV_AA); //検出した顔を赤色矩形で囲む
		}

		imshow("window", frame);//画像を表示.

		int key = waitKey(1);
		if (key == 113)//qボタンが押されたとき
		{
			break;//whileループから抜ける(終了)
		}
	}
	destroyAllWindows();
	return 0;
}

プロパティの設定

プロパティマネージャーの「detectFacefromCamera」をダブルクリックしてビルドに必要なプロパティの設定をしていきます。

こちらの設定については以下の記事の「プロパティの設定」をご参照ください。

OpenCVとC++とVisualStudioで顔認識してみる

プログラムの実行

プルダウンで「Release」「x64」を選択して「実行」ボタンを押下します。こちらは先程のプロパティの設定と合わせてください。私は64bitを使用しているので「x64」を選択します。WebカメラはあらかじめPCのUSBポートに接続しておきます。

動画の人をWebカメラで撮ってみると顔認識することができます。

関連記事

こんな記事も書いてます。

OpenCVでカスケード分類器を自作する方法

カスケード分類器でペットボトルを判別してみる

YOLOでペットボトルの物体検出をやってみた

Google ColabでYOLOを動かすことを検討してみる

Google Colaboratory上でYOLOを動かして画像認識させてみた

まとめ

思っていたよりスムーズに顔認識してくれてよかったです。正面の顔は認識されますが、横顔とかだとあまり認識されないようです。ここまでは比較的簡単にできたのでもっと改良していきたいと思います。

 

 

画像処理カテゴリの最新記事