OpenCV 顔認識(Cで)

この前の顔認識のサンプルはopencv2で書かれていたようなので、
今回はopencv1(と言って良いのかな?)でサンプルも参考にしつつ自分で書いてみた。
opencv2をつかわなければCだけでいけるみたい。

#include "opencv/cv.h"
#include "opencv/highgui.h"

int main(){
    
    /*画像読み込み グレースケール作成*/
    IplImage* img;
    img = cvLoadImage("/Users/ユーザ名/Desktop/akb48.jpeg", CV_LOAD_IMAGE_COLOR);
    IplImage* gray;
    gray= cvCreateImage (cvGetSize (img), IPL_DEPTH_8U, 1);
    cvCvtColor (img, gray, CV_BGR2GRAY);
    cvEqualizeHist (gray, gray);
    
    /*分類器のカスケードを読み込み*/
    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade *) cvLoad ("/opt/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml", 0, 0, 0);
    
    /*メモリの確保*/
    CvMemStorage *storage = 0;
    storage = cvCreateMemStorage (0);
    cvClearMemStorage (storage);
    
    /*顔の検出*/
    CvSeq *faces;
    faces = cvHaarDetectObjects (gray, cascade, storage, 1.11, 4, 0);
    
    /*顔の位置に矩形を描画*/
    int i;
    CvScalar colors[] = {
    {{0, 0, 255}}, {{0, 128, 255}},
    {{0, 255, 255}}, {{0, 255, 0}},
    {{255, 128, 0}}, {{255, 255, 0}},
    {{255, 0, 0}}, {{255, 0, 255}}
    };
    
    for (i = 0; i < (faces ? faces->total : 0); i++) {
        CvRect *r = (CvRect *) cvGetSeqElem (faces, i);
        cvRectangle(img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), colors[i%8], 3, CV_AA);
    }
    
    cvNamedWindow ("faces", CV_WINDOW_AUTOSIZE);
    cvShowImage ("faces",img);
    cvWaitKey (0);
    cvDestroyWindow("faces");
    cvReleaseImage(&img);
    cvReleaseImage(&gray);
    cvReleaseMemStorage (&storage);
    
    return 0;
}


f:id:highdef:20140221154529p:plain

今回は円じゃなく矩形を描画してみた。




僕特にAKB好きじゃないんですけど、写りがよくて正面向いた顔がいっぱい並んでる写真が欲しいとAKBがお手軽ですね。