opencv 人脸识别学习笔记(一)

将D:\opencv-4.6.0\OpenCV_4.6.0-Build\install\etc\haarcascades 中的上述连个文件放入 build-opencvFace下

1. Mat
Mat faceROI = imgGray(Rect rect); 截取rect 位置大小的内容
Rect 成员变量 x,y,width,height
2. CascadeClassifier 级联分类器
load(string xmlPath); 加载xml
detectMultiScale(
Mat img,
vector<Rect> vectors, // 存入检测到的(输出结果)
double scaleFactor = 1.1, //缩放系数
int minNeighbors = 3,
int flags,
Size minsize = Size(),
Size maxsize = Size(),
)
Mat img 输入图像 必须是灰度图CV_8UC1
vector <Rect> 输出结果
scaleFactor 缩放系数 Haar 检测器用固定大小窗口扫描原图;想要检测大小不同人脸,
就不断把图像缩小。
minNeightbors 邻域过滤 同一个人脸位置,会产生多个重叠候选框
flags 0 | CASCADE_SCALE_IMAGE 缩放图像做检测
minSize 小于 30x30 像素的人脸跳过,过滤微小噪声
maxSize 超过尺寸的物体直接无视
3. opencv 四舍五入取整
cvRound(double radius);
4. 画椭圆、椭圆弧
ellipse(
cv::Mat imgSrc, //在imgSrc 上画
cv::Point center, // 中心坐标
cv::Size size, // 椭圆的长半轴 短半轴
double angle, // 旋转角度
double startAngle, // 圆弧起始角度
doble endAngle, //圆弧终止角度
const cv::Scalar& color, //椭圆颜色
int thickness = 1, // 线条宽度
int lineType = LINE_8, // 线条类型
int shift = 0 // 坐标小数位数
);
5. circle
circle(
cv::Mat imgSrc, // 在imgSrc上画
cv::Point center, // 中心坐标
int radius, // 半径
const cv::Scalar& color, //颜色
int tickness = 1, // 线宽
int lineType = cv::LINE_8, // 线类型
int shift = 0 // 小数位数
);
// 初始化级联分类器
CascadeClassifier face_detector;
CascadeClassifier eye_detector;
string fDetectorModelPath = "haarcascade_frontface_alt.xml";
string eDetectorModelPAth = "haarcascade_eye_tree_eyeglasses.xml";
face_detector.load(fDetectorModelPath);
eye_detector.load(eDetectorModelPath;
// 图片预处理 彩色转灰色
Mat imgSrc = myImg;
Mat imgGray;
cvtColor(imgSrc, imgGray, COLOR_RGB2GRAY);
equalizeHist(imgGray, imgGray); // 直方图均衡化 增强单通道灰度图像对比度
减少颜色对人脸识别造成的干扰
// 执行多尺度人脸检测
vector<Rect> faces;
face_detector.detectMultiScale(imgGray, faces, 1.1, 3, 0| CASCADE_SCALE_IMAGE, Size(30, 30));
for(int i = 0 ; i < faces.size(); ++i){
Point center = Point(
faces[i].x + faces[i].width/2.0,
faces[i].y + faces[i].height/2.0
);
ellipse(imgSrc, center, Size(faces[i].size()), 0, 0, 360, Scalar(225,0,255), 4 , 8 , 0);
Mat faceROI = imgGray(faces[i]);
vector<Rect> eyes;
eye_detector(facesROI, eyes, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30,30));
for(int j = 0; j < eyes.size(); ++j){
Point eye_center = Point(
faces[i].x + eyes[j].x + eyes[j].width/2.0,
faces[i].y + eyes[j].y + eyes[j].height/2.0
)
int radius = (eyes[j].width + eyes[j].height)*0.25;
circle(imgSrc, eye_center, radius, Scalar(225,0,225), 4 , 8 , 0);
}
}
QImage img = QImage((const unsigned char*)imgSrc.data, imgSrc.cols, imgSrc.rows, static_cast<int>(imgSrc.step), QImage::Format_RGB888);
face.h
#ifndef FACE_H
#define FACE_H
#include <QWidget>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
namespace Ui {
class Face;
}
class Face : public QWidget
{
Q_OBJECT
public:
explicit Face(QWidget *parent = nullptr);
~Face();
void initmainwindow();
void imgShow();
void imgProc();
private slots:
void on_pushButton_clicked();
private:
Ui::Face *ui;
Mat myImg;
QImage myQImg;
};
#endif // FACE_H
face.cpp
#include "face.h"
#include "ui_face.h"
Face::Face(QWidget *parent) :
QWidget(parent),
ui(new Ui::Face)
{
ui->setupUi(this);
initmainwindow();
}
Face::~Face()
{
delete ui;
}
void Face::initmainwindow()
{
QString imgPath = "2.webp";
Mat imgData = imread(imgPath.toStdString());
cvtColor(imgData, imgData, COLOR_BGR2RGB);
myImg = imgData;
myQImg = QImage((const unsigned char*)imgData.data, imgData.cols, imgData.rows, static_cast<int>(imgData.step), QImage::Format_RGB888);
imgShow();
}
void Face::imgShow()
{
ui->label->setPixmap(QPixmap::fromImage(myQImg));
}
void Face::imgProc()
{
//1. 初始化级联分类器
CascadeClassifier face_detector;
CascadeClassifier eye_detector;
// 人眼模型
string eDetectorXml = "haarcascade_eye_tree_eyeglasses.xml";
// 人脸模型
string fDetectorXml = "haarcascade_frontalface_alt.xml";
face_detector.load(fDetectorXml); // 向级联分类器加载 模型
eye_detector.load(eDetectorXml);
//2. 图片预处理
Mat imgSrc = myImg;
Mat imgGray;
cvtColor(imgSrc, imgGray, COLOR_RGB2GRAY); //彩色转灰色
equalizeHist(imgGray, imgGray); // 直方图均衡化 增强单通道灰度图像对比度 减少颜色对人脸识别造成的干扰
//3. 执行多尺度人脸检测
vector<Rect> faces;
face_detector.detectMultiScale(imgGray,faces, 1.1, 3, 0|CASCADE_SCALE_IMAGE , Size(30,30)); //
for(int i = 0; i < faces.size() ; ++i){
Point center = Point(faces[i].x + faces[i].width/2.0, faces[i].y + faces[i].height/2.0);
ellipse(imgSrc,center,Size(faces[i].size()),0, 0, 360,Scalar(255,0,255),4,8,0);
Mat faceROI = imgGray(faces[i]);
// 人眼检测
vector<Rect> eyes;
eye_detector.detectMultiScale(faceROI,eyes,1.1,3,0|CASCADE_SCALE_IMAGE, Size(30,30));
for(int j = 0; j <eyes.size(); ++j){
Point eye_center = Point(
faces[i].x + eyes[j].x + eyes[j].width/2.0,
faces[i].y + eyes[j].y + eyes[j].height/2.0
);
int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
circle(imgSrc, eye_center, radius, Scalar(233,233,0),4,8,0);
}
}
myQImg = QImage((const unsigned char*)imgSrc.data, imgSrc.cols, imgSrc.rows, (static_cast<int>(imgSrc.step)), QImage::Format_RGB888);
imgShow();
}
void Face::on_pushButton_clicked()
{
imgProc();
}
face.ui

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)