#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <string>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include "colordetector.h"
#include "opencvcolordetector.h"
using namespace std;
using namespace cv;
CascadeClassifier face_cascade, eyes_cascade;
//该类没有实现,只是在头文件中有个声明
//开始的时候没有加入相对应的静态库
String window_name = "Face Detection";
Mat frame;
void detectFaces(Mat frame) {
std::vector<Rect> faces;
//定义一些不同的颜色表征出不同的人脸
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 frame_gray;
// 灰度变换
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
// 直方图均衡
equalizeHist(frame_gray, frame_gray);
// 多尺度人脸检测
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
//需要把:x,y,width,height 四个参数单独提取出来。提高速度
char vec[5];
char path[25] = "I:\\image\\roiImage";
char jpg[] = ".jpg";
char con[100];
Mat roiImage(frame.rows, frame.cols, CV_8UC3);
// 人脸检测结果判定
for (size_t i = 0; i < faces.size(); i++)
{
// 检测到人脸中心
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);//定义2D点
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
frame(cv::Rect(faces[i].x, faces[i].y, faces[i].width,
faces[i].height)).copyTo(roiImage);
sprintf(vec, "%d", i);//格式化输出,转换成字符串输出
sprintf(con, "%s%s%s", path, vec, jpg);
imwrite(con, roiImage);
}
imshow(window_name, frame);//是连续显示图片的形式显示的
//当满足条件是保存图片到本地。保存多张不同图片
imwrite("I:\\image\\re.jpg", frame); //保存读取到的图片
//从保存的静态图片中读取人脸信息。
}
void detectEyes(Mat frame) {
std::vector<Rect> faces;
//定义一些不同的颜色表征出不同的人脸
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 frame_gray;
// 灰度变换
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
// 直方图均衡
equalizeHist(frame_gray, frame_gray);
// 多尺度人脸检测
eyes_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
//需要把:x,y,width,height 四个参数单独提取出来。提高速度
char vec[5];
char path[25] = "I:\\image\\roiImage";
char jpg[] = ".jpg";
char con[100];
Mat roiImage(frame.rows, frame.cols, CV_8UC3);
// 人脸检测结果判定
for (size_t i = 0; i < faces.size(); i++)
{
// 检测到人脸中心
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);//定义2D点
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
frame(cv::Rect(faces[i].x, faces[i].y, faces[i].width,
faces[i].height)).copyTo(roiImage);
sprintf(vec, "%d", i);//格式化输出,转换成字符串输出
sprintf(con, "%s%s%s", path, vec, jpg);
imwrite(con, roiImage);
}
imshow(window_name, frame);//是连续显示图片的形式显示的
//当满足条件是保存图片到本地。保存多张不同图片
imwrite("I:\\image\\re.jpg", frame); //保存读取到的图片
//从保存的静态图片中读取人脸信息。
}
int main(int argc, char *argv[])
{
Mat image;
image = cv::imread("C:\\Users\\Administrator\\Desktop\\QTsucai\\1.jpg");
bool b=face_cascade.load("F:\\Qt_opencv\\third_part\\etc\\haarcascades\\haarcascade_frontalface_alt.xml");
bool a=eyes_cascade.load("F:\\Qt_opencv\\third_part\\etc\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml");
detectFaces(image);
detectEyes(image);
waitKey(20);
getchar();
return 0;
}
opencv人脸识别,瞳孔检测
最新推荐文章于 2024-02-24 14:20:05 发布