人臉檢測,呵呵,模擬別人的

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章