opencv 正脸和侧脸检测

算法参考三篇论文:

最早的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 //两轴的翻转

 

你可能感兴趣的:(C++,opencv,人脸识别,侧脸)