通过opencv的人脸检测器lbpcascade_frontalface_improved.xml识别人脸
头文件:
//
// Created by zhoujinyan on 2022/3/28.
//
#ifndef MYOPENCV_CHECK_FACE_H
#define MYOPENCV_CHECK_FACE_H
#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>
#include<stdio.h>
#include <show_video.h>
#include <opencv2/imgproc/imgproc_c.h>
namespace BICV {
namespace CHIST {
using namespace cv;
using namespace std;
class CheckFace {
public:
CheckFace();
~CheckFace() = default;
int isFace();
};
}
}
#endif //MYOPENCV_CHECK_FACE_H
源码实现:
//
// Created by zhoujinyan on 2022/3/28.
//
#include "check_face.h"
#include <iostream>
namespace BICV {
namespace CHIST {
class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector {
public:
CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector) :
IDetector(),
Detector(detector) {
CV_Assert(detector);
}
void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects) {
Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);
}
~CascadeDetectorAdapter() {
}
private:
CascadeDetectorAdapter();
cv::Ptr<cv::CascadeClassifier> Detector;
};
DetectionBasedTracker *getTracker() {
// OpenCV自带模型位置F:\opencvWin\opencv\build\etc\lbpcascades
String path = "D:\\software\\opencv\\opencv\\build\\etc\\lbpcascades\\lbpcascade_frontalface_improved.xml";
//String path = "D:\\software\\opencv\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml";
// String path = "F:\\opencvWin\\facetrain\\samples\\data\\cascade.xml";//无法识别
Ptr<CascadeClassifier> classifier = makePtr<CascadeClassifier>(path);
//适配器
Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(classifier);
Ptr<CascadeClassifier> classifier1 = makePtr<CascadeClassifier>(path);
//适配器
Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(classifier1);
//跟踪器
DetectionBasedTracker::Parameters DetectorParams;
DetectionBasedTracker *tracker = new DetectionBasedTracker(mainDetector, trackingDetector, DetectorParams);
return tracker;
}
CheckFace::CheckFace() {
}
int CheckFace::isFace() {
DetectionBasedTracker *tracker = getTracker();
//开启跟踪器
tracker->run();
//获取相机数据
VideoCapture capture(0);
Mat Sourceimg;
Mat gray;
Mat test;
while (1) {
capture >> Sourceimg;
//转灰度图处理
cvtColor(Sourceimg, gray, COLOR_BGR2GRAY);
//增强对比度 (直方图均衡)
equalizeHist(gray, gray);
//创建保存检测到人脸的向量集合
std::vector<Rect> faces;
//灰度图识别处理
tracker->process(gray);
//获取结果
tracker->getObjects(faces);
for (Rect face : faces) {
printf("zjy show check face\n");
//分别指定 bgra
if (face.x < 0 || face.width < 0 || face.x + face.width > Sourceimg.cols ||
face.y < 0 || face.height < 0 || face.y + face.height > Sourceimg.rows) {
continue;
}
//在原图画框框
rectangle(Sourceimg, face, Scalar(255, 0, 255));
#if 0
int i = 0;
while (true){
//制作正样本
Mat m;
//把img中的脸部位拷贝到m中
Sourceimg(face).copyTo(m);
//把人脸 重新设置为 24x24大小的图片
resize(m, m, Size(24, 24));
//转成灰度
cvtColor(m, m, COLOR_BGR2GRAY);
char p[200];
sprintf(p, "../face_res/%d.jpg", i++);
//把mat写出为jpg文件
imwrite(p, m);
m.release();
if(i == 100){
break;
}
}
#endif
}
imshow("camera", Sourceimg);
//27 == ESC 等待30毫秒退出
if (waitKey(30) == 27) {
break;
}
}
if (!Sourceimg.empty()) Sourceimg.release();
if (!gray.empty()) gray.release();
capture.release();
tracker->stop();
delete tracker;
return 0;
}
}
}
CMakeLists.txt 配置:
cmake_minimum_required(VERSION 3.17)
project(MyOpencv)
set(CMAKE_CXX_STANDARD 17)
set(OpenCV_DIR D:\\software\\opencv\\opencv\\mingw-build)
find_package(OpenCV REQUIRED)
include_directories(include)
include_directories(${OpenCV_INCLUDE_DIRS})
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs opencv_objdetect)
add_executable(MyOpencv main.cpp include/show_video.h source/show_video.cpp include/check_face.h source/check_face.cpp)
target_link_libraries(MyOpencv ${OpenCV_LIBS})
主要是增加:opencv_objdetect