用opencv自带的haar方法进行人脸识别并切割

来源:互联网 发布:免费的视频剪辑软件 编辑:程序博客网 时间:2024/05/16 08:21
// FaceRecognize.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include "opencv2/opencv.hpp"#include <iostream> using namespace std;using namespace cv;string cascadeName = "D:\\Program Files\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml";  IplImage* cutImage(IplImage* src, CvRect rect) {  cvSetImageROI(src, rect);  IplImage* dst = cvCreateImage(cvSize(rect.width, rect.height),  src->depth,  src->nChannels);  cvCopy(src,dst,0);  cvResetImageROI(src);  return dst;  }  IplImage* detect( Mat& img, CascadeClassifier& cascade, double scale)  {  int i = 0;  double t = 0;  vector<Rect> faces;Mat gray,smallImg(cvRound (img.rows/scale),cvRound(img.cols/scale), CV_8UC1);  cvtColor(img,gray,CV_BGR2GRAY);  resize(gray,smallImg,smallImg.size(),0,0,INTER_LINEAR);  equalizeHist(smallImg,smallImg);  t=(double)cvGetTickCount();cascade.detectMultiScale(smallImg,faces,1.3,2,CV_HAAR_SCALE_IMAGE,Size(30,30));  t=(double)cvGetTickCount()-t;printf("detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );  for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end();r++,i++){IplImage* temp = cutImage(&(IplImage(img)), cvRect(r->x, r->y, 250, 250));// 或 r->width, r->height  return temp;  }  return NULL;  }  int _tmain(int argc, _TCHAR* argv[]){CascadeClassifier cascade;    if(!cascade.load(cascadeName))  {  return -1;  }Mat srcImg, targetImg;  IplImage* faceImage1;   srcImg = imread("1.jpg");   faceImage1 = detect(srcImg,cascade,1);if (faceImage1 == NULL) {  return -1;  }  cvSaveImage("face.jpg", faceImage1, 0);   cout<<"over";getchar();return 0;}

顺便附上我的切割图像


原创粉丝点击