vs下opencv的人脸检测以及qt下dll的封装调用(一、opencv下的人脸检测以及图片的保存)

该博客介绍了如何在Visual Studio环境下使用OpenCV进行人脸识别,并将相关功能封装到DLL中,以便在Qt应用中调用。通过加载XML级联分类器进行人脸检测,然后对检测到的人脸进行图像裁剪和保存。
#include "opencv/cv.hpp"  
#include "opencv2/objdetect/objdetect.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include <time.h>
#include <iostream>  
#include <stdio.h>  
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;


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(80, 80));
	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, r->width, r->height));
		return temp;
	}


	return NULL;
}

IplImage* det(Mat srcImg, char* path, String cascadeName){


	IplImage *dst1 = 0;			//目标图像指针
	IplImage *dst2 = 0;			//目标图像指针
	CvSize dst_cvsize;			//目标图像尺寸
	CascadeClassifier cascade;
	if (!cascade.load(cascadeName))
	{
		cout << "cascade not load" << endl;
	}

	IplImage* faceImage1;
	clock_t start2, finish2;
	double totaltime2;
	start2 = clock();
	faceImage1 = detect(srcImg, cascade, 1);
	finish2 = clock();
	totaltime2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;
	std::cout << "detectface time is :" << totaltime2 << "sec" << std::endl;


	if (faceImage1 == NULL) {


		cout << "no image"<< endl;
	}

	dst_cvsize.width = 224;		//目标图像的宽为源图象宽的scale倍
	dst_cvsize.height = 224;		//目标图像的高为源图象高的scale倍


	dst1 = cvCreateImage(dst_cvsize, faceImage1->depth, faceImage1->nChannels);	//构造目标图象
	//   cvResize(src, dst, CV_INTER_LINEAR);	//缩放源图像到目标图像
	cvResize(faceImage1, dst1, CV_INTER_CUBIC);		//缩放源图像到目标图像


	cvSaveImage(path, dst1, 0);
	cv::Mat im1 = cv::cvarrToMat(dst1);	
	cvReleaseImage(&faceImage1);
	return dst1;
	
}




int main(int argc, char* argv[])
{
	char* path = "D:\\VStest\\face\\face1.jpg";        //待检测图片
	Mat srcImage =imread ( "D:\\VStest\\face\\0a.jpg");   //检测后图片保存路径
	String cascadeName = "D:\\3月27vs\\haarcascades\\haarcascade_frontalface_alt.xml";


	IplImage* a = det(srcImage, path, cascadeName);
	cvShowImage("a",a);


	 cv::waitKey(1100);
		return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值