使用OpenCv实现人脸跟踪(一)

简介

  • OpenCV是一个基于BSD许可开源发行的跨平台计算机视觉库。拥有C++,Python和Java接口,并且支持Windows, Linux, Mac OS, iOS 和 Android系统。实现了图像处理和计算机视觉方面的很多通用算法。

主要模块以及功能

模块 功能
Core 核心基础模块,定义了被所有其他模块和基本数据结构(包括重要的多维数组Mat)使用的基本函数、底层数据结构和算法函数
Imgproc 图像处理模块,包括:滤波、高斯模糊、形态学处理、几何变换、颜色空间转换及直方图计算等
Highgui 高层用户交互模块,包括:GUI、图像与视频I\O等
Video 视频分析,,运动分析及目标跟踪
Calib3d 3D模块,包括:摄像机标定、立体匹配、3D重建等
Features2d 二维特征检测与描述模块,包括:图像特征检测、描述、匹配等
Objdetect 目标检测模块,如:人脸检测等
MI 机器学习模块,包括:支持向量机、神经网络等
Flann 最近邻开源库。包含一系列查找算法,自动选取最快算法的机制。
Imgcodecs 图像编解码模块,图像文件的读写操作
Photo 图像计算(处理)模块,图像修复及去噪。
Shape 形状匹配算法模块。描述形状、比较形状
Stitching 图像拼接
Superres 超分辨率模块
Videoio 视频读写模块,视频文件包括摄像头的输入
Videostab 解决拍摄的视频稳定
Dnn 深度神经网络
contrib 可以引入额外模块

人脸定位

人脸定位,是人脸检测、识别的基础,比如像美图的贴纸,B612相机的贴纸啊,等等,都是需要先定位到人脸而后再进行处理,人脸识别,现在比较流行的就是刷脸支付。

代码

这个前提是先配置好xcode环境,不会配置的,看它(https://blog.csdn.net/YuQing_Cat/article/details/83113424)

这个是FaceTracking.cpp文件

#include "FaceTracking.h"

int main(int argc, const char * argv[]) {
   
    //分类器 智能指针
    Ptr<CascadeClassifier> classifier = makePtr<CascadeClassifier>("/Users/.../OpenCV-android-sdk/sdk/etc/lbpcascades/lbpcascade_frontalface.xml");
    //创建一个跟踪适配器
    Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(classifier);
    
    //分类器 智能指针
    Ptr<CascadeClassifier> classifier1 = makePtr<CascadeClassifier>("/Users/.../OpenCV-android-sdk/sdk/etc/lbpcascades/lbpcascade_frontalface.xml");
    //再创建一个跟踪适配器
    Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(classifier1);
    DetectionBasedTracker::Parameters DetectorParams;
    Ptr<DetectionBasedTracker> tracker = makePtr<DetectionBasedTracker>(mainDetector,trackingDetector,DetectorParams);
    //开启跟踪器
    tracker->run();
    VideoCapture capture(0);
    Mat img;
    Mat gray;
   
    while (1) {
        capture >> img;
        //变成灰度图片
        //img的颜色空间为BGR,现在比较主流的颜色空间为RGB
        //但是在早期时候是BGR
        cvtColor(img, gray, COLOR_BGR2GRAY);
        //增强对比度(直方图均衡)
        equalizeHist(gray, gray);
        std::vector<Rect> faces;
        //定位人脸 N个
        tracker->process(gray);
        tracker->getObjects(faces);
        for ( Rect face : faces ) {
            //画矩形
            //分别指定bgr
            rectangle(img, face, Scalar(0, 0, 255));
        }
        
        imshow("摄像头", img);
        
        waitKey(30);
    }
    
    tracker->stop();
    
    return 0;
    
}

这个是.h文件

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;

class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector
{
public:
    CascadeDetectorAdapter(Ptr<CascadeClassifier> detector) :IDetector(),
    Detector(detector){
        
        CV_Assert(detector);
    }
    
    void detect(const Mat &Image, std::vector<cv::Rect> &objects)
    {
        //返回一个矩形
        Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);
    }
    
    virtual ~CascadeDetectorAdapter()
    {
        
    }
    
private:
    CascadeDetectorAdapter();
    Ptr<CascadeClassifier> Detector;
};

效果图

本来打开的其实是摄像头,因为想识别多个人,就用了照片代替

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/YuQing_Cat/article/details/83117466