#はじめに
前回OpenCVを用いて静止画に対して顔検出を行なった.
↓↓
【初心者向け】OpenCVで顔検出を行う
それを応用し,今回はUSBカメラから動画を取得してリアルタイムで顔検出を行なってみたいと思います.
#環境
- OpenCV v3.4.2
- VisualStudio2017
- 顔検出に用いるカスケード分類器(ここからダウンロードしてください)
- USBカメラ
※正面の顔を検出するカスケード分類器は,上記の GitHub からダウンロードしたファイルの
"opencv-master\opencv-master\data\haarcascades"の中に入っている【haarcascade_frontalface_alt.xml】を使います.
#ソースコード
detectFacefromCamera.cpp
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <vector>
using namespace cv;
using namespace std;
int main()
{
Mat frame; //USBカメラから得た1フレームを格納する場所
CascadeClassifier cascade; //カスケード分類器格納場所
cascade.load("ファイルまでのパス/haarcascade_frontalface_alt.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;
}
#実行結果
OpenCVを用いてUSBカメラから得た動画で顔検出 pic.twitter.com/bZizivSoil
— Yuto (@yutoakaut) 2018年8月10日
顔は検出できていますが,誤検出がちらほらありますね.
他にもOpenCVを用いて色々試してみたいと思います.