opencv 人脸检测

通过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 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值