您的位置:首页 > 运维架构

【OpenCV学习笔记 014】人脸人眼识别

2016-10-02 11:36 603 查看
源码示例

#include "cv.h"
#include "highgui.h"
#include <assert.h>
#include <iostream>

using namespace std;

int main(){

double scale = 1.3;
IplImage* img = cvLoadImage("gilrPicture.png");
cvNamedWindow("结果图", CV_WINDOW_AUTOSIZE);
IplImage* grayImg = cvCreateImage(cvGetSize(img), img->depth, 1);
IplImage* smallImg = cvCreateImage(cvSize(cvRound(img->width / scale), cvRound(img->height / scale)), IPL_DEPTH_8U, 1);
cvCvtColor(img, grayImg, CV_BGR2GRAY);
cvResize(grayImg, smallImg, CV_INTER_LINEAR);
cvEqualizeHist(smallImg, smallImg);	//使灰度图像直方图均衡化。归一化图像亮度和增强对比度

string eyeStr("eye");
CvMemStorage* storagel = 0;
storagel = cvCreateMemStorage(0);	//创建内部存储器
CvHaarClassifierCascade *cascade_f = NULL;

const char* cascade_name1 = "D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";
cascade_f = (CvHaarClassifierCascade*)cvLoad(cascade_name1, 0, 0, 0);

assert(cascade_f != NULL);
CvSeq *faces = cvHaarDetectObjects(grayImg, cascade_f, storagel, 1.1, 3, 8, cvSize(20, 20));

for (int i = 0; i < (faces ? faces->total : 0); i++)
{
CvRect *face = (CvRect*)cvGetSeqElem(faces, i);

cvRectangle(grayImg, cvPoint(face->x, face->y), cvPoint(face->x + face->width, face->y + face->height)
, CV_RGB(255, 0, 0), 1, 4, 0);

cvSetImageROI(grayImg, cvRect(face->x, face->y + (face->height / 5.5), face->width, face->height / 3.0));

CvMemStorage* storage = 0;
storage = cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade_e = 0;
const char* cascade_name2 = "D:\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml";
cascade_e = (CvHaarClassifierCascade*)cvLoad(cascade_name2, 0, 0, 0);
assert(cascade_e != NULL);
//storage = cvCreateMemStorage(0) ;

CvSeq *eyes = cvHaarDetectObjects(grayImg, cascade_e, storage, 1.1, 3, 3, cvSize(1, 1));
int j;
cout << eyes->total << endl;

IplImage* temp = cvCreateImage(cvGetSize(grayImg), grayImg->depth, 1);
cvCopyImage(grayImg, temp);
CvSize dst_cvsize;
dst_cvsize.width = 150;
dst_cvsize.height = 150;

for (j = 0; j < (eyes ? eyes->total : 0); j++)
{
char char2[100];
_itoa(j, char2, 10);//把数字转换成字符型
eyeStr.append(char2);
eyeStr.append(".jpg");

CvRect *eye = (CvRect*)cvGetSeqElem(eyes, j);

cvSetImageROI(temp, cvRect(eye->x, eye->y, eye->width, eye->height));//设置感兴趣区

IplImage* dst = cvCreateImage(cvSize(eye->width, eye->height), IPL_DEPTH_8U, 1);
IplImage* fixed_dst = cvCreateImage(dst_cvsize, IPL_DEPTH_8U, 1);
cvCopy(temp, dst, 0);//temp是输入,dst是输出
cvResetImageROI(temp);
cvResize(dst, fixed_dst, CV_INTER_LINEAR);//图像缩放
cvNamedWindow(eyeStr.c_str(), 1);
cvShowImage(eyeStr.c_str(), fixed_dst);
cvSaveImage(eyeStr.c_str(), fixed_dst);
eyeStr.clear();
eyeStr.append("eye");

cvRectangle(grayImg, cvPoint(eye->x, eye->y), cvPoint(eye->x + eye->width, eye->y + eye->height), CV_RGB(255, 0, 0), 1, 4, 0);
cvReleaseImage(&dst);
cvReleaseImage(&fixed_dst);
}
cvResetImageROI(grayImg);
}

cvShowImage("结果图", grayImg);
cvWaitKey(0);
cvReleaseImage(&grayImg);
cvDestroyWindow("结果图");
return 0;
}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: