关闭

opencv 人脸识别代码

标签: 脸部识别opencv
686人阅读 评论(0) 收藏 举报
分类:

人脸识别代码:

#include "cv.h" 
#include "highgui.h"

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <assert.h> 
#include <math.h> 
#include <float.h> 
#include <limits.h> 
#include <time.h> 
#include <ctype.h>

#ifdef _EiC 
#define WIN32 
#endif

static CvMemStorage* storage = 0; 
static CvHaarClassifierCascade* cascade = 0;

void detect_and_draw( IplImage* image );

const char* cascade_name = "D:\\opencv_3.1.0\\opencv\\data\\haarcascades_cuda\\haarcascade_frontalface_alt.xml";   //此处用的是绝对路径,可自己拷贝到工程路径下

int main( int argc, char** argv ) 
{ 
	cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); 
	if( !cascade ) 
	{ 
		fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); 
		return -1; 
	} 

	storage = cvCreateMemStorage(0); 
	cvNamedWindow( "result", 1 ); 

	const char* filename = "D:\\heying.jpg"; 
	IplImage* image = cvLoadImage( filename, 1 );

	if( image ) 
	{ 
		detect_and_draw( image ); 
		cvWaitKey(0); 
		cvReleaseImage( &image );   
	}

	cvDestroyWindow("result"); 

	return 0; 
}

void detect_and_draw(IplImage* img ) 
{ 
	double scale=1.2; 

	static 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)
	};//Just some pretty colors to draw with

	//Image Preparation 
	// 
	IplImage* gray = cvCreateImage(cvSize(img->width,img->height),8,1); 
	IplImage* small_img=cvCreateImage(cvSize(cvRound(img->width/scale),cvRound(img->height/scale)),8,1); 
	cvCvtColor(img, gray, CV_BGR2GRAY); 
	cvResize(gray, small_img, CV_INTER_LINEAR);

	cvShowImage( "small_img", small_img ); 

	cvEqualizeHist(small_img,small_img); //直方图均衡

	cvShowImage( "EqualizeHist_small_img", small_img ); 

	//Detect objects if any 
	cvClearMemStorage(storage); 
	double t = (double)cvGetTickCount(); 
	CvSeq* objects = cvHaarDetectObjects(small_img, 
		cascade, 
		storage, 
		1.1, 
		2, 
		0/*CV_HAAR_DO_CANNY_PRUNING*/, 
		cvSize(20,20));

	t = (double)cvGetTickCount() - t; 
	printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );

	//Loop through found objects and draw boxes around them 
	//矩形标注
	for(int i=0;i<(objects? objects->total:0);++i) 
	{ 
		CvRect* r=(CvRect*)cvGetSeqElem(objects,i); 
		cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]); 
	} 

	//圆形标注
	for( int i = 0; i < (objects? objects->total : 0); i++ ) 
	{ 
		CvRect* r = (CvRect*)cvGetSeqElem( objects, i ); 
		CvPoint center; 
		int radius; 
		center.x = cvRound((r->x + r->width*0.5)*scale); 
		center.y = cvRound((r->y + r->height*0.5)*scale); 
		radius = cvRound((r->width + r->height)*0.25*scale); 
		cvCircle( img, center, radius, colors[i%8], 2, 2, 0 ); 
	}

	cvShowImage( "result", img ); 
	cvReleaseImage(&gray); 
	cvReleaseImage(&small_img); 
}


效果图:





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:451084次
    • 积分:5128
    • 等级:
    • 排名:第5386名
    • 原创:98篇
    • 转载:102篇
    • 译文:0篇
    • 评论:55条
    最新评论