1. 程式人生 > >使用OpenCv實現人臉跟蹤(一)

使用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;
};

效果圖

本來開啟的其實是攝像頭,因為想識別多個人,就用了照片代替

在這裡插入圖片描述