#include "cv.h"
#include "highgui.h"
int main()
{
//讀取攝像頭
//聲明IplImage指針
IplImage* pFrame = NULL;
CvCapture* pCapture = NULL;
IplImage* pgray=NULL;
IplImage* pcanny;
CvMemStorage* storage=0;
CvHaarClassifierCascade* cascade=0;
char cascadename[100]="D:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"; //訓練好的級聯表可以用于比對
cascade = (CvHaarClassifierCascade*)cvLoad(cascadename,0,0,0);
storage = cvCreateMemStorage(0);
CvSeq* faces;
//視窗通過視窗名來辨別
cvNamedWindow("video", 1);
pCapture = cvCaptureFromCAM(-1); //cvCreateCameraCapture(-1);//-1代表打開哪個攝像頭都無所謂或隻有一個攝像頭
bool first=true;
while(pFrame = cvQueryFrame( pCapture ))
{
if(first)//初次循環,做些初始化
{
first=false;
//建立單通道圖檔
pgray=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);
//這是canny邊緣監測,和我原來做的差分得邊緣不是一個級别的
pcanny=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);
}
//将彩色圖轉化為2值圖
cvCvtColor(pFrame,pgray,CV_BGR2GRAY);
cvCanny(pgray,pcanny,30,100,3); //canny邊緣檢測
/*********************************/
//檢測人臉,
faces = cvHaarDetectObjects(pgray,cascade,
storage,1.1,2,0
,cvSize(30,30));
for(short i=0;i<(faces?faces->total:0);i++)
{
//得到人臉的區域
CvRect* rect = (CvRect*)cvGetSeqElem(faces,i);
//在人臉區域畫個圓圈
CvPoint center; //中心
center.x=rect->x+rect->width/2;
center.y=rect->y+rect->height/2;
short radius = sqrt(pow(rect->width,2)//半徑
+pow(rect->height,2))/2;
CvScalar color={{255,0,0}}; //畫圈的顔色
cvCircle(pFrame,center,radius,color,3,8,0);
/**********************************/
}
//顯示圖像
//cvShowImage("video", pcanny);
cvShowImage("video", pFrame);
//延時 ,不然不會顯示圖像的,應該是掃描太快了
if(cvWaitKey(10)>= 0)
{
break;
}
}
//釋放圖像
cvReleaseImage(&pFrame);
cvReleaseImage(&pgray);
cvReleaseImage(&pcanny);
//銷毀視窗
cvDestroyWindow("video");
//釋放攝像裝置
cvReleaseCapture(&pCapture);
return 0;
}