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; }
今回は円じゃなく矩形を描画してみた。
僕特にAKB好きじゃないんですけど、写りがよくて正面向いた顔がいっぱい並んでる写真が欲しいとAKBがお手軽ですね。