#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
#include <iostream>
#include <fstream>
using namespace std;
#define GENERTATE 1
#if GENERTATE == 1
int main()
{
int filename = 0;
// 加载Haar特征检测分类器
// haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
const char *pstrCascadeFileName = "D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
// 载入图像
char pstrImageName[100];
for (int fileinput = 1; fileinput < 100; fileinput++)
{
sprintf(pstrImageName, "C:\\Users\\_Phoenix_Luo\\Desktop\\新建文件夹\\generateFace\\face\\%d.png", fileinput);
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
if (pSrcImage)
{
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
if (pSrcImage->nChannels >= 3)
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
else
cvCopy(pSrcImage, pGrayImage); //复制图像 //pGrayImage = pSrcImage;
// 人脸识别与标记
if (pHaarCascade != NULL)
{
CvScalar FaceCirclecolors[] =
{
{ { 0, 0, 255 } },
{ { 0, 128, 255 } },
{ { 0, 255, 255 } },
{ { 0, 255, 0 } },
{ { 255, 128, 0 } },
{ { 255, 255, 0 } },
{ { 255, 0, 0 } },
{ { 255, 0, 255 } }
};
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
cvClearMemStorage(pcvMStorage);
// 识别
DWORD dwTimeBegin, dwTimeEnd;
dwTimeBegin = GetTickCount();
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
dwTimeEnd = GetTickCount();
printf("人脸个数: %d 识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
// 标记
for (int i = 0; i <pcvSeqFaces->total; i++)
{
CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width * 0.5));
center.y = cvRound((r->y + r->height * 0.5));
radius = cvRound((r->width + r->height) * 0.25);
//----------------------------------
//CvSize size = cvSize(24, 24);//区域大小
//cvSetImageROI(pGrayImage, cvRect(r->x, r->y, r->width, r->height));//设置源图像ROI
//IplImage* pDest = cvCreateImage(size, pGrayImage->depth, pGrayImage->nChannels);//创建目标图像
//cvCopy(pGrayImage, pDest); //复制图像
//cvResetImageROI(pGrayImage);//源图像用完后,清空ROI
//cvSaveImage("Roi.png", pDest);//保存目标图像
CvSize size = cvSize(24, 24);//区域大小
IplImage* pDest = cvCreateImage(size, pGrayImage->depth, pGrayImage->nChannels);//创建目标图像
cvSetImageROI(pGrayImage, cvRect(r->x, r->y, r->width, r->height));//设置源图像ROI
cvResize(pGrayImage, pDest);//缩放img图像,并将数据拷贝到img1 cvResize(src, dst, CV_INTER_LINEAR); //缩放源图像到目标图像
//cvCopy(pGrayImage, pDest); //复制图像
cvResetImageROI(pGrayImage);//这句是必须的,在img1的ROI区域显示img
char str[200] = { 0 };
IplImage *exist = NULL;
do{
filename++;
sprintf(str, "C:\\Users\\_Phoenix_Luo\\Desktop\\新建文件夹\\generateFace\\FrontScenedistribute\\face1\\%d.png", filename);
exist = cvLoadImage(str, CV_LOAD_IMAGE_UNCHANGED);
} while (exist);
cvReleaseImage(&exist);
cvSaveImage(str, pDest);//保存目标图像
//----------------------------------
//cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
}
cvReleaseMemStorage(&pcvMStorage);
}
//const char *pstrWindowsTitle = "人脸识别 (http://blog.youkuaiyun.com/MoreWindows)";
//cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
//cvShowImage(pstrWindowsTitle, pSrcImage);
//cvWaitKey(0);
//cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
fileinput++;
}
}
printf("generate %d face image\n", filename);
return 0;
}
#elif GENERTATE == 0
#endifOpenCV产生人脸正样本
最新推荐文章于 2022-11-14 23:43:35 发布
本文介绍如何使用OpenCV进行人脸检测,并从图片中截取人脸部分进行保存。通过加载Haar特征分类器,实现对一系列图像的人脸检测与标记,同时将检测到的人脸区域保存为独立文件。
7万+

被折叠的 条评论
为什么被折叠?



