Opencv與dlib聯合進行人臉關鍵點檢測與識別

前言

依賴庫:opencv 2.4.9 /dlib 19.0/libfacedetection
本篇不記錄如何配置,重點在實現上。使用libfacedetection實現人臉區域檢測,聯合dlib標記人臉特征點,最后使用opencv的FaceRecognizer實現人臉識別。

準備工作

1、配置好Opencv2.4.9。(Opencv3.1需要另外下載一個包才有FaceRecognizer)
2、配置好dlib 19.0(版本其實沒有多大關系)
3、配置好ShiQi.Yu的人臉檢測庫

思想

訓練模塊:人臉檢測——>獲取人臉區域的點坐標——>人臉關鍵點標記——>人臉對正——>歸一化處理——>保存圖片——>手動篩選圖片——>訓練樣本——>得到train.xml
識別模塊:讀取train.xml——>循環(人臉檢測——>獲取人臉區域的點坐標——>人臉關鍵點標記——>人臉對正——>歸一化處理——>送入model->predict——>預測出結果——>putText在方框上寫出名字)

結果

識別速度:0.15~0.25秒,Release平臺。
識別精度:還可以
使用了一段中國好聲音的視頻做識別。
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
當然,這里用的是Fisherface算法,主要還是樣本不多,已經可以搞定了。

代碼

ReadCSV.h

#include <opencv.hpp>
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
static void read_csv(const string& filename, cv::vector<Mat>& images, cv::vector<int>& labels, char separator = ';') {std::ifstream file(filename.c_str(), ifstream::in);if (!file) {string error_message = "No valid input file was given, please check the given filename.";CV_Error(CV_StsBadArg, error_message);}string line, path, classlabel;while (getline(file, line)) {stringstream liness(line);getline(liness, path, separator);getline(liness, classlabel);if (!path.empty() && !classlabel.empty()) {images.push_back(imread(path, 0));labels.push_back(atoi(classlabel.c_str()));}}
}

FaceRotate.h

#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include<dlib/opencv/cv_image.h>
#include <dlib/opencv.h>using namespace dlib;frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;//Already get

FaceRecognition.cpp

#include <FaceDetect.h>
#include <ReadCSV.h>
const int namenumber = 4;//測試的人臉數量
const string textname[namenumber] = { "Hariem", "Miss.Na", "Mr.Wang", "Jay.Chou" };//做一個儲存人臉名字的數組Ptr<FaceRecognizer>  GetTrainModel(string fn_csv)//輸入CSV文件的路徑名
{vector<Mat> images; vector<int> labels;try {read_csv(fn_csv, images, labels);}catch (cv::Exception& e) {cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;// 文件有問題,我們啥也做不了了,退出了exit(1);}// 如果沒有讀取到足夠圖片,我們也得退出.if (images.size() <= 1) {string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";CV_Error(CV_StsError, error_message);}Ptr<FaceRecognizer> model = createEigenFaceRecognizer(80);//創建人臉識別類 可修改 LBPHFace、EigenFace、FisherFacemodel->train(images, labels);return model;
}int main()
{Dlib_Predefine();//加載dlib的文件Ptr<FaceRecognizer> model = GetTrainModel("face.csv");//獲得模型VideoCapture cap("好聲音.mp4");Mat frame,gray;while (true){cap >> frame;if (!frame.empty()){gray = FaceDetect(frame);if (!gray.empty())putText(frame, textname[model->predict(gray)], Point(50, 50), FONT_HERSHEY_DUPLEX, 3, Scalar(230, 255, 0), 2);//model->predict(frame) = predictLabel 名字寫在 1 1imshow("Face Recogniton", frame);waitKey(1);}else{ cout << "The Video's end." <<endl; break; }}}

FaceDetect.cpp

用了掩碼。

#include <FaceDetect.h>
#include <FaceRotate.h>
void Dlib_Predefine()
{deserialize("shape_predictor_68_face_landmarks.dat") >> sp;//讀入標記點文件
}cv::Mat FaceToOne(cv::Mat source)//歸一化處理函數
{cv::equalizeHist(source, source);//直方圖均衡cv::resize(source, source, cv::Size(92, 112));//裁剪cv::Mat Mask = cv::imread("mask.jpg", 0);cv::Mat changedMask;source.copyTo(changedMask, Mask);return changedMask;
}Mat FaceDetect(Mat frame)//臉是否存在
{Mat gray, error;cvtColor(frame, gray, CV_BGR2GRAY);int * pResults = NULL;pResults = facedetect_frontal_tmp((unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, gray.step, 1.2f, 5, 24);int peopleNUM = (pResults ? *pResults : 0);for (int i = 0; i < peopleNUM; i++)//代表有幾張人臉(pResults ? *pResults : 0){short * p = ((short*)(pResults + 1)) + 6 * i;Rect opencvRect(p[0], p[1], p[2], p[3]);//gray = gray(opencvRect);cv::rectangle(frame, opencvRect, Scalar(230, 255, 0));dlib::rectangle dlibRect((long)opencvRect.tl().x, (long)opencvRect.tl().y, (long)opencvRect.br().x - 1, (long)opencvRect.br().y - 1);//人臉對齊技術提高了準確率dlib::full_object_detection shape = sp(dlib::cv_image<uchar>(gray), dlibRect);//標記點std::vector<full_object_detection> shapes;shapes.push_back(shape);//把點保存在了shape中dlib::array<array2d<rgb_pixel>>  face_chips;extract_image_chips(dlib::cv_image<uchar>(gray), get_face_chip_details(shapes), face_chips);Mat pic = toMat(face_chips[0]);cvtColor(pic, pic, CV_BGR2GRAY);return FaceToOne(pic);}return error;
}

FaceDetect.h

#include <opencv.hpp>
#include "facedetect-dll.h"using namespace cv;
using namespace std;Mat FaceDetect(Mat frame);
void Dlib_Predefine();//dlib 預定義的函數

FaceRotate.h

#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include<dlib/opencv/cv_image.h>
#include <dlib/opencv.h>using namespace dlib;frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;//Already get

Mask圖片:
這里寫圖片描述

轉載于:https://www.cnblogs.com/mtcnn/p/9412040.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457555.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Category 的一些事

來源&#xff1a;伯樂在線 - Tsui YuenHong 鏈接&#xff1a;http://ios.jobbole.com/90422/ 點擊 → 申請加入伯樂在線專欄作者 新增實踐部分&#xff1a;偏方 Hook 進某些方法來添加功能 Category – 簡介 Category&#xff08;類別&#xff09;是 Objective-C 2.0 添加的新特…

python tfidf特征變換_機器學習的“萬能模板” - 數據分析

最后是文本變量。很遺憾Titanic數據集中沒有合適的文本變量。一般我們處理文本變量的方法是&#xff0c;合并所有的文本形成一個變量&#xff0c;然后調用Count Vectorizer或者TfidfVectorizer算法&#xff0c;將文本數據轉換成數字。大部分情況下&#xff0c;TfidfVectorizer比…

python實現哈希表

# python 實現哈希表class HashTable:"""哈希函數的構造解決沖突"""def __init__(self, source):self.source sourceself._index []self._val []self.table []self._mod 13def Output(self):print(self._index)print(self._val)def _create…

商品綜合評價排名

店內有很多產品&#xff0c;而且包含但不局限于以下指標&#xff1a;瀏覽量、訪客數、平均停留時長、詳情頁跳出率、下單轉化率、下單支付轉化率、支付轉化率、下單金額、下單商品件數、下單買家數、支付金額、支付商品件數、加購件數、訪客平均價值、收藏人數、客單價、搜索支…

ionic資源網站

http://ionichina.com/topic/570b1f4ecd63e4247a7cfcf3 http://doc.ionicmaterialdesign.com/#intro http://ionicmaterial.com/demo/ 10大materialhttp://www.open-open.com/news/view/192f93e轉載于:https://www.cnblogs.com/znsongshu/p/6079357.html

pytorch神經網絡因素預測_實戰:使用PyTorch構建神經網絡進行房價預測

微信公號&#xff1a;ilulaoshi / 個人網站&#xff1a;lulaoshi.info本文將學習一下如何使用PyTorch創建一個前饋神經網絡(或者叫做多層感知機&#xff0c;Multiple-Layer Perceptron&#xff0c;MLP)&#xff0c;文中會使用PyTorch提供的自動求導功能&#xff0c;訓練一個神經…

SQL基本操作

SQL 操作 檢索數據 SELECT 檢索數據 -- 檢索單個列 SELECT 列名 FROM table_name;-- 檢索多個列 SELECT 列1, 列2 FROM table_name;-- 檢索所有列 SELECT * FROM table_name;-- 檢索不同的值 SELECT DISTINCT 列名 FROM table_name;限制檢索結果 -- SQL Server / Access SE…

git 忽略 部分文件夾_git提交忽略某些文件或文件夾

記得第一次用 github 提交代碼&#xff0c;node_modules 目錄死活傳不上去&#xff0c;哈哈哈&#xff0c;后來才知道在 .gitignore 文件里設置了忽略 node_modules 目錄上傳。是的&#xff0c; .gitignore 文件就是設置那些你不想用 git 一起上傳的文件和文件夾。比如剛接觸到…

Ajax實現原理詳解

Ajax&#xff1a;Asynchronous javascript and xml&#xff0c;實現了客戶端與服務器進行數據交流過程。使用技術的好處是&#xff1a;不用頁面刷新&#xff0c;并且在等待頁面傳輸數據的同時可以進行其他操作。 這就是異步調用的很好體現。首先得了解什么是異步和同步的概念。…

SpringJDBC解析3-回調函數(update為例)

PreparedStatementCallback作為一個接口&#xff0c;其中只有一個函數doInPrepatedStatement&#xff0c;這個函數是用于調用通用方法execute的時候無法處理的一些個性化處理方法&#xff0c;在update中的函數實現&#xff1a; protected int update(final PreparedStatementCr…

python上下文管理器

DAY 23. python上下文管理器 Python 的 with 語句支持通過上下文管理器所定義的運行時上下文這一概念。 此對象的實現使用了一對專門方法&#xff0c;允許用戶自定義類來定義運行時上下文&#xff0c;在語句體被執行前進入該上下文&#xff0c;并在語句執行完畢時退出該上下文&…

勾股定理python思路_趣叮咚編程數學揭秘:為什么勾股定理a+b=c?

我們都知道&#xff1a;三角形3個外角之和360度可是誰知道為什么等于360度呢&#xff1f;其實利用編程制作動圖演繹了解啦&#xff1a;那勾股定理abc又是為什么呢&#xff1f;還有很多有趣的數學公式都可以演繹&#xff1a;圓的面積公式、圓周長...通過動圖演繹原來晦澀難懂的定…

System.InvalidOperationException : 不應有 Response xmlns=''。

xml如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <Response version"2"><datacash_reference>4700203048783633</datacash_reference><information>Failed to identify the card scheme of the supp…

Navicat Premium連接SQL Server

Navicat Premium連接SQL Server 步驟&#xff1a; 激活SQL Server 服務配置SQL Server網絡配置連接SQL Server 激活SQLServer服務 直接搜索 計算機管理 點 服務和應用程序&#xff0c; 點 SQL Server配置管理器&#xff0c; 雙擊第一個SQL Server服務 不出意外的話&#xf…

mysql 單標遞歸_MySql8 WITH RECURSIVE遞歸查詢父子集的方法

背景開發過程中遇到類似評論的功能是&#xff0c;需要時用查詢所有評論的子集。不同數據庫中實現方式也不同&#xff0c;本文使用Mysql數據庫&#xff0c;版本為8.0Oracle數據庫中可使用START [Param] CONNECT BY PRIORMysql 中需要使用 WITH RECURSIVE需求找到name為張三的孩子…

processon完全裝逼指南

一、引言 作為一名IT從業者&#xff0c;不僅要有扎實的知識儲備&#xff0c;出色的業務能力&#xff0c;還需要具備一定的軟實力。軟實力體現在具體事務的處理能力&#xff0c;包括溝通&#xff0c;協作&#xff0c;團隊領導&#xff0c;問題的解決方案等&#xff0c;這些能力在…

mysql在空閑8小時之后會斷開連接(默認情況)

調試程序的過程發現&#xff0c;在mysql連接空閑一定時間&#xff08;默認8小時&#xff09;之后會斷開連接&#xff0c;需要重新連接&#xff0c;也引發我對重連機制的思考。轉載于:https://www.cnblogs.com/ppzbty/p/5707576.html

selector多路復用_多路復用器Selector

Unix系統有五種IO模型分別是阻塞IO(blocking IO)&#xff0c;非阻塞IO( non-blocking IO)&#xff0c;IO多路復用(IO multiplexing)&#xff0c;信號驅動(SIGIO/Signal IO)和異步IO(Asynchronous IO)。而IO多路復用通常有select&#xff0c;poll&#xff0c;epoll&#xff0c;k…

解決svn log顯示no author,no date的方法之一

只要把svnserve.conf中的anon-access read 的read 改為none&#xff0c;也不需要重啟svnserve就行 sh-4.1# grep "none" /var/www/html/svn/pro/conf/svnserve.conf ### and "none". The sample settings below are the defaults. anon-access none轉載…

REST framework 權限管理源碼分析

REST framework 權限管理源碼分析 同認證一樣&#xff0c;dispatch()作為入口&#xff0c;從self.initial(request, *args, **kwargs)進入initial() def initial(self, request, *args, **kwargs):# .......# 用戶認證self.perform_authentication(request)# 權限控制self.che…