// 加载Haar特征检测分类器
// haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
const char *pstrCascadeFileName = "F:\\haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
IplImage* motion = 0;
CvCapture* capture = 0; //视频获取结构
capture = cvCaptureFromCAM( 0 );
//capture = cvCaptureFromAVI( "1344.avi" );
if( capture )
{
cvNamedWindow( "Motion", 1 );
for(;;)
{
IplImage* image;
if( !cvGrabFrame( capture )) //从摄像头或者视频文件中抓取帧
break;
image = cvRetrieveFrame( capture ); //取回由函数cvGrabFrame抓取的图像,返回由函数cvGrabFrame 抓取的图像的指针
cvShowImage( "Motion", image );
IplImage *pGrayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvCvtColor(image, pGrayImage, CV_BGR2GRAY);
cvNamedWindow("灰度图",1);
cvShowImage("灰度图",pGrayImage);
if( cvWaitKey(10) >= 0 )
break;
//const char *pstrImageName = "F:\\z.jpg";
//IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
// 人脸识别与标记
if (pHaarCascade != NULL)
{
CvScalar FaceCirclecolors[] =
{
0, 0, 255,
0, 128, 255,
0, 255, 255,
0, 255, 0,
255, 128, 0,
255, 255, 0,
255, 0, 0,
255, 0, 255
};
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
cvClearMemStorage(pcvMStorage);
// 识别
DWORD dwTimeBegin, dwTimeEnd;
dwTimeBegin = GetTickCount();
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
dwTimeEnd = GetTickCount();
printf("人脸个数: %d 检测用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
// 标记
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(image, center, radius, FaceCirclecolors[i % 8], 2);
}
cvReleaseMemStorage(&pcvMStorage);
}
const char *pstrWindowsTitle = "人脸检测 ";
cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsTitle, image);
/* cvWaitKey(0);
cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&image);
cvReleaseImage(&pGrayImage);
return 0; */
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Motion" );
}
// haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
const char *pstrCascadeFileName = "F:\\haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
IplImage* motion = 0;
CvCapture* capture = 0; //视频获取结构
capture = cvCaptureFromCAM( 0 );
//capture = cvCaptureFromAVI( "1344.avi" );
if( capture )
{
cvNamedWindow( "Motion", 1 );
for(;;)
{
IplImage* image;
if( !cvGrabFrame( capture )) //从摄像头或者视频文件中抓取帧
break;
image = cvRetrieveFrame( capture ); //取回由函数cvGrabFrame抓取的图像,返回由函数cvGrabFrame 抓取的图像的指针
cvShowImage( "Motion", image );
IplImage *pGrayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
cvCvtColor(image, pGrayImage, CV_BGR2GRAY);
cvNamedWindow("灰度图",1);
cvShowImage("灰度图",pGrayImage);
if( cvWaitKey(10) >= 0 )
break;
//const char *pstrImageName = "F:\\z.jpg";
//IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
// 人脸识别与标记
if (pHaarCascade != NULL)
{
CvScalar FaceCirclecolors[] =
{
0, 0, 255,
0, 128, 255,
0, 255, 255,
0, 255, 0,
255, 128, 0,
255, 255, 0,
255, 0, 0,
255, 0, 255
};
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
cvClearMemStorage(pcvMStorage);
// 识别
DWORD dwTimeBegin, dwTimeEnd;
dwTimeBegin = GetTickCount();
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
dwTimeEnd = GetTickCount();
printf("人脸个数: %d 检测用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
// 标记
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(image, center, radius, FaceCirclecolors[i % 8], 2);
}
cvReleaseMemStorage(&pcvMStorage);
}
const char *pstrWindowsTitle = "人脸检测 ";
cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsTitle, image);
/* cvWaitKey(0);
cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&image);
cvReleaseImage(&pGrayImage);
return 0; */
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Motion" );
}
return 0;
参考地址:http://blog.youkuaiyun.com/zhangjikuan/article/details/39926317
注意的问题:在加载Haar特征检测分类器 的时候,网上说是...opencv/sources/data/haarcascades下的haarcascade_frontalface_alt.xml,结果运行会出现加载分类器的错误。后来发现应该是data目录下的haarcascades_cuda下的
haarcascade_frontalface_alt.xml。(我用的是opencv 3.0版本)