算法参考三篇论文:
最早的Haar特征由Papageorgiou C.等提出(《A general framework for object detection》),后来Paul Viola和Michal Jones提出利用积分图像法快速计算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。之后,Rainer Lienhart 和 Jochen Maydt用对角特征对Haar特征库进行了扩展(《An extended set of Haar-like features for rapid object detection》)。OpenCV的Haar分类器就是基于扩展后的特征库实现的。
int main(){
const char *pstrImageName = "test.jpg";
IplImage *pSrcImage = cvLoadImage(pstrImageName, 0);
if(!pSrcImage){
cout << pstrImageName << "can't load " << endl;
return -1;
}
// 加载Haar特征检测分类器
// haarcascade_frontalface_alt.xml系OpenCV自带的分类器
const char *pstrCascadeFileName = "D:/Program Files/OpenCv244/opencv/data/haarcascades/haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
// 人脸识别与标记
if (pHaarCascade != NULL)
{
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pSrcImage, pHaarCascade, pcvMStorage);
// 标记
for(int i = 0; i <pcvSeqFaces->total; i++)
{
CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width * 0.5));
center.y = cvRound((r->y + r->height * 0.5));
radius = cvRound((r->width + r->height) * 0.25);
cvCircle(pSrcImage, center, radius, cvScalar(255));
}
cvReleaseMemStorage(&pcvMStorage);
}
cvNamedWindow("face detection", CV_WINDOW_AUTOSIZE);
cvShowImage("face detection", pSrcImage);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&pSrcImage);
}
Opencv 2.4.3以后添加了侧脸检测,要想检测侧脸只需将加载的文件改为haarcascade_profileface.xml,这个只是识别图形上朝一边的脸,如果想要识别朝另一边的脸就需要对图片进行水平翻转,再进行检测。
opencv中实现图片的翻转用
Flip:垂直,水平或即垂直又水平翻转二维数组
void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0);
flip_mode=-1(x、y) 0(x) 1(y)
0 // 垂直镜像 1 // 水平镜像 -1 //两轴的翻转