在这里插入代码片
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void detechAndDraw(Mat &img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip);
int face_detech()
{
Mat imag = imread("E:\\Work\\Qt\\1_CStudy\\face_recognition\\face_recognition\\11.png");
if (!imag.data)
{
cout << "no data!" << endl;
return -1;
}
CascadeClassifier cascade, nestedCascade;
bool stop = false;
cascade.load("E:\\Install\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
nestedCascade.load("E:\\Install\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml");
detechAndDraw(imag, cascade, nestedCascade, 2, 0);
waitKey();
return 0;
}
void detechAndDraw(Mat &img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip)
{
int i = 0;
double t = 0;
vector<Rect> faces, faces2;
const static Scalar colors[] = {
CV_RGB(0,0,255),
CV_RGB(0,128,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,128,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)
};
Mat gray, smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);
cvtColor(img, gray, CV_BGR2GRAY);
imshow("灰度", gray);
resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
imshow("缩小尺寸", smallImg);
equalizeHist(smallImg, smallImg);
imshow("直方图均值处理", smallImg);
t = (double)cvGetTickCount();
cascade.detectMultiScale(smallImg, faces,
1.1, 2, 0
| CV_HAAR_SCALE_IMAGE
, Size(30, 30));
if (tryflip)
{
flip(smallImg, smallImg, 1);
imshow("反转图像", smallImg);
cascade.detectMultiScale(smallImg, faces2,
1.1, 2, 0
|CV_HAAR_FIND_BIGGEST_OBJECT

|CV_HAAR_DO_ROUGH_SEARCH
| CV_HAAR_SCALE_IMAGE
, Size(30, 30));
for (vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++)
{
faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
}
}
t = (double)cvGetTickCount() - t;
for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++)
{
Mat smallImgROI;
vector<Rect> nestedObjects;
Point center;
Scalar color = colors[i % 8];
int radius;
double aspect_ratio = (double)r->width / r->height;
if (0.75 < aspect_ratio && aspect_ratio < 1.3)
{
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
circle(img, center, radius, color, 3, 8, 0);
}
else
rectangle(img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
cvPoint(cvRound((r->x + r->width - 1)*scale), cvRound((r->y + r->height - 1)*scale)),
color, 3, 8, 0);
if (nestedCascade.empty())
continue;
smallImgROI = smallImg(*r);
nestedCascade.detectMultiScale(smallImgROI, nestedObjects,
1.1, 2, 0
|CV_HAAR_FIND_BIGGEST_OBJECT
|CV_HAAR_DO_ROUGH_SEARCH
|CV_HAAR_DO_CANNY_PRUNING
| CV_HAAR_SCALE_IMAGE
, Size(30, 30));
for (vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++)
{
center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
radius = cvRound((nr->width + nr->height)*0.25*scale);
circle(img, center, radius, color, 3, 8, 0);
}
}
imshow("识别结果", img);
}