顔検出,顔識別(Dlib,face_recognition のインストールと動作確認)(Python を使用)(Windows 上)
出典
http://www.aianet.ne.jp/~asada/prog_doc/opencv/opencv_obj_det_img.htm
#!/bin/bash
cd /tmp
cat >/tmp/facedetect.cpp <<-CPROGRAM
#include "cv.h"
#include "highgui.h"
// 顔検出(静止画)
int main(int argc, char** argv) {
// 顔検出対象の画像データ用
IplImage* tarImg;
// 検出対象の画像ファイルパス
char* tarFilePath = argv[1];
// 画像データの読み込み
tarImg = cvLoadImage(tarFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
// 正面顔検出器の読み込み
CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml");
// 検出に必要なメモリストレージを用意する
CvMemStorage* cvMStr = cvCreateMemStorage(0);
// 検出情報を受け取るためのシーケンスを用意する
CvSeq* face;
// 画像中から検出対象の情報を取得する
face = cvHaarDetectObjects(tarImg, cvHCC, cvMStr);
for (int i = 0; i < face->total; i++) {
// 検出情報から顔の位置情報を取得
CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
// 取得した顔の位置情報に基づき、矩形描画を行う
cvRectangle(tarImg,
cvPoint(faceRect->x, faceRect->y),
cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
CV_RGB(255, 0 ,0),
3, CV_AA);
}
// 顔位置に矩形描画を施した画像を表示
cvNamedWindow("face_detect");
cvShowImage("face_detect", tarImg);
// キー入力待ち
cvWaitKey(0);
// ウィンドウの破棄
cvDestroyWindow("face_detect");
// 用意したメモリストレージを解放
cvReleaseMemStorage(&cvMStr);
// カスケード識別器の解放
cvReleaseHaarClassifierCascade(&cvHCC);
// イメージの解放
cvReleaseImage(&tarImg);
return 0;
}
CPROGRAM
cd /tmp
g++ -o a.out facedetect.cpp -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_objdetect -lopencv_features2d -lopencv_highgui -lopencv_imgproc -lopencv_core
cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml .
./a.out lena_std.jpg
cp /home/kkaneko/rinkou/od/data/att_faces/att_faces.tar.Z .
cp orl_faces/*/*.pgm .
画面表示せず、ファイルに保存 #include "cv.h" #include "highgui.h" // 顔検出(静止画) int main(int argc, char** argv) { // 顔検出対象の画像データ用 IplImage* tarImg; // 検出対象の画像ファイルパス char* tarFilePath = argv[1]; // 画像データの読み込み tarImg = cvLoadImage(tarFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); // 正面顔検出器の読み込み CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml"); // 検出に必要なメモリストレージを用意する CvMemStorage* cvMStr = cvCreateMemStorage(0); // 検出情報を受け取るためのシーケンスを用意する CvSeq* face; // 画像中から検出対象の情報を取得する face = cvHaarDetectObjects(tarImg, cvHCC, cvMStr); for (int i = 0; i < face->total; i++) { // 検出情報から顔の位置情報を取得 CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i); // 取得した顔の位置情報に基づき、矩形描画を行う cvRectangle(tarImg, cvPoint(faceRect->x, faceRect->y), cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height), CV_RGB(255, 0 ,0), 3, CV_AA); } // save image file cvsaveImage( argv[2], tarImg); // 用意したメモリストレージを解放 cvReleaseMemStorage(&cvMStr); // カスケード識別器の解放 cvReleaseHaarClassifierCascade(&cvHCC); // イメージの解放 cvReleaseImage(&tarImg); return 0; }
- OpenCV付属の顔検出サンプルプログラムを動かしてみる
OpenCV付属の顔検出サンプルプログラムを動かしてみる
ビデオでも静止画でも動く顔検出のプログラム
cd /tmp
cp /usr/local/share/OpenCV/samples/c/facedetect.cpp .
gcc -o a.out facedetect.cpp -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_objdetect -lopencv_features2d -lopencv_highgui -lopencv_imgproc -lopencv_core
cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml .
cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_eye.xml .
cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml .
* lena_std.jpg を使って実行
cp /usr/local/share/OpenCV/samples/c/lena_std.jpg .
./a.out --cascade=haarcascade_frontalface_alt.xml --nested-cascade=haarcascade_frontalface_eye.xml lena_std.jpg