出典
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; }
ビデオでも静止画でも動く顔検出のプログラム
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