#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;
}vs下opencv的人脸检测以及qt下dll的封装调用(一、opencv下的人脸检测以及图片的保存)
最新推荐文章于 2020-06-06 17:34:30 发布
该博客介绍了如何在Visual Studio环境下使用OpenCV进行人脸识别,并将相关功能封装到DLL中,以便在Qt应用中调用。通过加载XML级联分类器进行人脸检测,然后对检测到的人脸进行图像裁剪和保存。

564

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



