#include "stdafx.h"
#include "Find.h"
#include <stdio.h>
#include <iostream>
#include <cv.h>
#include <ml.h>
#include <cxcore.h>
#include <highgui.h>
using namespace std;
using namespace cv;
char wndname[] = "Edge";
char tbarname[] = "Threshold";
IplImage *image = 0, *cedge = 0, *gray = 0, *edge = 0;
// define a trackbar callback
void on_trackbar(int h)
{
cvSmooth( gray, edge, CV_BLUR, 3, 3, 0, 0 );
cvNot( gray, edge );
// Run the edge detector on grayscale
cvCanny(gray, edge, (float)h, (float)h*3, 3);
cvZero( cedge );
// copy edge points
cvCopy( image, cedge, edge );
cvShowImage("ed",edge);
cvShowImage("im", image);
cvShowImage("gr", gray);
cvShowImage(wndname, cedge);
}
void detect_and_draw(IplImage * image)
{
if(!image)
{
printf("cvloadimage fail\n");
return;
}
CvHaarClassifierCascade * cascade =0; //分类器
const char * cascade_name = "C:\\OPENCV243\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
cascade = (CvHaarClassifierCascade *)cvLoad(cascade_name,0,0,0); //加载XML分类文件
if(!cascade)
{
printf("load cascade fail");
return;
}
CvMemStorage * storage = 0; //临时内存
storage = cvCreateMemStorage(0); //用来创建一个内存存储器,来统一管理各种动态对象的内存
if(!storage)
{
printf("CreateMemStorage fail");
return;
}
IplImage * gray = cvCreateImage(cvGetSize(image),8,1);
if(!gray)
{
printf("Create gray image fail");
return;
}
cvCvtColor(image,gray,CV_BGR2GRAY); // 转灰度图
cvEqualizeHist(gray,gray); //直方图均衡化
cvClearMemStorage(storage);//清空内存块
double detectime = (double)cvGetTickCount();
CvSeq * faces = cvHaarDetectObjects(gray,cascade,storage,//按此设置去detect
1.1,3,0,cvSize(20,20));
detectime = (double)cvGetTickCount() - detectime;
printf("the detecttime is %lf ",detectime);
//把检测出来的框转为圆
CvRect * r ;
CvPoint center; //人脸圆心坐标
int radius; //半径
const 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(int i = 0;i < faces->total; i++)
{
r = (CvRect *) cvGetSeqElem(faces,i); //取第i个元素
center.x = cvRound(r->x + r->width*0.5);
center.y = cvRound(r->y + r->height*0.5);
radius = (r->width + r->height) *0.25;
cvCircle(image,center,radius,colors[i%8],3,8,0);
}
cvNamedWindow("drawface",1);
cvShowImage("drawface",image);
cvSaveImage("result.jpg",image);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&gray);
cvReleaseMemStorage(&storage);
}
int main( int argc, char** argv )
{
IplImage * image = cvLoadImage("C:\\Users\\LC\\Desktop\\常用标准图\\tra.jpg",1);
detect_and_draw(image);
cvReleaseImage(&image);
getchar();
return 0;
}
人脸检测,呵呵,模拟别人的
最新推荐文章于 2022-10-11 15:07:44 发布