Haar特征和LBP特征原理
//人脸检测
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//导入识别文件
String fileName = "E:/opencv/opencv3.4/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
//创建识别类对象
CascadeClassifier face_classifier;
int main(int argc, char** argv)
{
if (!face_classifier.load(fileName))
{
cout << "could not load the xml.." << endl;
return -1;
}
Mat src, dst;
src = imread("3.jpg", 1);
if (src.empty())
{
cout << "could not load the picture.." << endl;
return -1;
}
imshow("src", src);
//灰度转换
cvtColor(src, dst, COLOR_BGR2GRAY);
//直方图均衡化,提高图形质量
equalizeHist(dst, dst);
vector<Rect>faces;
//进行检测
face_classifier.detectMultiScale(dst, faces, 1.1, 3, 0, Size(24, 24));
for (size_t t = 0; t < faces.size(); t++)
{
rectangle(src, faces[static_cast<int>(t)], Scalar(0, 0, 255), 1, 8, 0);
}
imshow("detect_faces", src);
waitKey(0);
return 0;
}
在视频中读取人脸,并识别眼睛
画眼睛
//视频人脸与眼睛检测
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//导入识别文件
String faceName = "E:/opencv/opencv3.4/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
String eyeName = "E:/opencv/opencv3.4/opencv/build/etc/haarcascades/haarcascade_eye.xml";
CascadeClassifier face_cascada;
CascadeClassifier eye_cascada;
int main(int argc, char** argv)
{
if (!face_cascada.load(faceName))
{
cout << "could not load the xml.." << endl;
return -1;
}
if (!face_cascada.load(eyeName))
{
cout << "could not load the xml.." << endl;
return -1;
}
VideoCapture capture(0);
Mat frame,gray;
vector<Rect>faces;
vector<Rect>eyes;
while (capture.read(frame))
{
cvtColor(frame, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
face_cascada.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30));
for (size_t t = 0; t < faces.size(); t++)
{
Rect roi;
roi.x = faces[static_cast<int>(t)].x;
roi.y = faces[static_cast<int>(t)].y;
roi.width = faces[static_cast<int>(t)].width;
roi.height = faces[static_cast<int>(t)].height/2;
Mat faceROI = frame(roi);
eye_cascada.detectMultiScale(faceROI, eyes, 1.2, 3, 0, Size(15, 15));
for (size_t k = 0; k < faces.size(); k++)
{
Rect rect;
rect.x = faces[static_cast<int>(t)].x + eyes[k].x;
rect.y = faces[static_cast<int>(t)].y + eyes[k].y;
rect.width = eyes[k].width;
rect.height = eyes[k].height;
rectangle(frame, rect, Scalar(0, 255, 0), 2, 8, 0);
}
rectangle(frame, faces[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
}
imshow("frame", frame);
char c = waitKey(30);
if (c == 27)
{
break;
}
}
waitKey(0);
return 0;
}
haar和LBP区别:
猫脸检测
创建模板进行人脸、眼睛检测与跟踪
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include<vector>
using namespace cv;
using namespace std;
//导入识别文件
String facefile = "E:/opencv/opencv3.4/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
String lefteyefile = "E:/opencv/opencv3.4/opencv/build/etc/haarcascades/haarcascade_eye.xml";
String righteyefile = "E:/opencv/opencv3.4/opencv/build/etc/haarcascades/haarcascade_eye.xml";
CascadeClassifier face_detector;
CascadeClassifier lefteye_detector;
CascadeClassifier righteye_detector;
Rect leftEye, rightEye;
//模板匹配函数
void trackEye(Mat& im, Mat& tpl, Rect&rect)
{
Mat result;
int result_cols = im.cols - tpl.cols + 1;
int result_rows = im.rows - tpl.rows + 1;
//模板匹配
result.create(result_rows, result_cols, CV_32FC1);
matchTemplate(im, tpl, result, TM_CCORR_NORMED);
//寻找位置
double minval, maxval;
Point minloc, maxloc;
minMaxLoc(result, &minval, &maxval, &minloc, &maxloc);
if (maxval > 0.75)
{
rect.x = rect.x + maxloc.x;
rect.y = rect.y + maxloc.y;
}
else
{
rect.x = rect.y = rect.width = rect.height = 0;
}
}
int main(int argc, char** argv)
{
if (!face_detector.load(facefile))
{
cout << "could not load the facefile xml..." << endl;
return -1;
}
if (!lefteye_detector.load(lefteyefile))
{
cout << "could not load the lefteyefile xml..." << endl;
return -1;
}
if (!righteye_detector.load(righteyefile))
{
cout << "could not load the righteyefile xml..." << endl;
return -1;
}
Mat frame;
VideoCapture capture;
namedWindow("demo_win", CV_WINDOW_NORMAL);
Mat gray;
vector<Rect> faces;
vector<Rect> eyes;
Mat lefttpl, righttpl;
while (capture.read(frame))
{
flip(frame, frame, 1);//沿x轴翻转图像
cvtColor(frame, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
face_detector.detectMultiScale(gray, faces, 1.1, 3, 0, Size(25, 25));
for (size_t t = 0; t < faces.size(); t++)
{
rectangle(frame, faces[t], Scalar(0, 0, 255), 2, 8, 0);
//计算offset ROI
int offsety = faces[t].height / 4;
int offsetx = faces[t].width / 8;
int eyeheight = faces[t].height/2- offsety;
int eyewidth = faces[t].width / 2 - offsetx;
//截取左眼区域
Rect leftRect;
leftRect.x = faces[t].x + offsetx;
leftRect.y = faces[t].y + offsety;
leftRect.width = eyewidth;
leftRect.height = eyeheight;
Mat leftRoi = gray(leftRect);
//检测左眼
lefteye_detector.detectMultiScale(leftRoi, eyes, 1.1, 1, 0, Size(20, 20));
if (lefttpl.empty())
{
if (eyes.size())
{
leftRect = eyes[0] + Point(leftRect.x, leftRect.y);
lefttpl = gray(leftRect);
rectangle(frame, leftRect, Scalar(0, 0, 255), 2, 8, 0);
}
}
else
{
//人脸检测与左眼跟踪
leftEye.x = leftRect.x;
leftEye.y = leftRect.y;
trackEye(leftRoi, lefttpl, leftEye);
if (leftEye.x > 0 && leftEye.y > 0)
{
leftEye.width = lefttpl.cols;
leftEye.height = lefttpl.rows;
rectangle(frame, leftEye, Scalar(0, 255, 255), 2, 8, 0);
}
}
//截取右眼区域
Rect rightRect;
rightRect.x = faces[t].x + faces[t].width/2;
rightRect.y = faces[t].y + offsety;
rightRect.width = eyewidth;
rightRect.height = eyeheight;
Mat rightRoi = gray(rightRect);
//检测右眼
righteye_detector.detectMultiScale(rightRoi, eyes, 1.1, 1, 0, Size(20, 20));
if (righttpl.empty())
{
if (eyes.size())
{
rightRect = eyes[0] + Point(rightRect.x, rightRect.y);
righttpl = gray(rightRect);
rectangle(frame, rightRect, Scalar(0, 255, 255), 2, 8, 0);
}
}
else
{
//人脸检测与右眼跟踪
rightEye.x = rightRect.x;
rightEye.y = rightRect.y;
trackEye(rightRoi, righttpl, rightEye);
if (rightEye.x > 0 && rightEye.y > 0)
{
rightEye.width = righttpl.cols;
rightEye.height = righttpl.rows;
rectangle(frame, rightEye, Scalar(0, 0, 255), 2, 8, 0);
}
}
}
imshow("demo_win", frame);
char c = cv::waitKey(100);
if (c == 27)
{
break;
}
}
capture.release();
cv::waitKey(0);
return 0;
}