使用OpenCv實現人臉跟蹤(一)
阿新 • • 發佈:2018-12-06
簡介
- 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;
};
效果圖
本來開啟的其實是攝像頭,因為想識別多個人,就用了照片代替