Matlab控制電腦攝像實(shí)現(xiàn)實(shí)時人臉檢測和識別詳解
一、理論基礎(chǔ)
人臉識別過程主要由四個階段組成:人臉檢測、圖像預(yù)處理、面部特征提取和特征識別。首先系統(tǒng)從視頻或者相機(jī)中捕獲圖像,檢測并分割出其中的人臉區(qū)域;接下來通過歸一化、對齊、濾波等方法改善圖像的質(zhì)量,這里的質(zhì)量主要由最終的人臉識別率決定;特征提取(降維)環(huán)節(jié)尤為重要,其初衷是減少數(shù)據(jù)量從而減輕計算負(fù)擔(dān),但良好的特征選取可以降低噪音和不相關(guān)數(shù)據(jù)在識別中的貢獻(xiàn)度,從而提高識別精度;特征識別階段需要根據(jù)提取的特征訓(xùn)練一個分類器,對于給定的測試樣本,根據(jù)訓(xùn)練器對其進(jìn)行分類。
當(dāng)定位好人臉的時候,我們進(jìn)行識別,識別的主要原理如下:
GRNN廣義回歸神經(jīng)網(wǎng)絡(luò)的理論基礎(chǔ)是非線性核回歸分析,非獨(dú)立變量y相對于獨(dú)立變量x的回歸分析實(shí)際上是計算具有最大概率值的y。設(shè)隨機(jī)變量x和y的聯(lián)合概率密度函數(shù)為f (x ,y),已知x的觀測值為X,則y相對于X的回歸,即條件均值為:
對于未知的概率密度函數(shù)f (x, y),可由x和y的觀測樣本經(jīng)非參數(shù)估計得:
GRNN通常被用來進(jìn)行函數(shù)逼近。它具有一個徑向基隱含層和一個特殊的線性層。第一層和第二層的神經(jīng)元數(shù)目都與輸入的樣本向量對的數(shù)目相等。GRNN結(jié)構(gòu)如圖2-3所示,整個網(wǎng)絡(luò)包括四層神經(jīng)元:輸入層、模式層、求和層與輸出層。
GRNN廣義回歸神經(jīng)網(wǎng)絡(luò)進(jìn)行映射學(xué)習(xí)達(dá)到了很好的效果.這些流形的方法都建立在一個假設(shè)上:同一個人不同姿態(tài)的圖像是高維空間中的一個低維流形.基于這個假設(shè),不同人在姿態(tài)變化下可以獲得較好的識別效果。
在matlab中,通過如下的驅(qū)動程序控制筆記本電腦的攝像頭:
%Set up video object. Note: to change to a different camera (or camera setup) change the following line: vid = videoinput('winvideo',1,'YUY2_640x480'); %Set the video object to always return rgb images: set(vid, 'ReturnedColorSpace', 'rgb'); triggerconfig(vid,'manual'); start(vid) %Initialize frame Frm and fps variable Frm = 0; fps = 0; %Set the total runtime in seconds runtime = 100; h = figure(1); tic; timeTracker = toc;
通過程序vid = videoinput('winvideo',1,'YUY2_640x480');完成攝像頭圖像的采集。
二、核心程序
clc; clear; close all; warning off; addpath 'func\' addpath 'facebase\' delete(imaqfind); %Set up video object. Note: to change to a different camera (or camera setup) change the following line: vid = videoinput('winvideo',1,'YUY2_640x480'); %Set the video object to always return rgb images: set(vid, 'ReturnedColorSpace', 'rgb'); triggerconfig(vid,'manual'); start(vid) %Initialize frame Frm and fps variable Frm = 0; fps = 0; %Set the total runtime in seconds runtime = 100; h = figure(1); tic; timeTracker = toc; load grnns.mat while toc < runtime toc Frm = Frm + 1; %獲得攝像頭圖像 I = getsnapshot(vid); %人臉跟蹤 [segment,f,R0,R1] = func_face_track(I); %獲得人臉區(qū)域 figure(1); subplot(221); imshow(uint8(I)); title('攝像頭視頻獲取'); subplot(222); imshow(f); subplot(223); imshow(R1); title('臉部定位'); %人臉識別(測試前需要加入自己所要測試的人臉的相關(guān)庫。比如你要測試你自己的臉,那么需要加入你的臉道庫中) R0re = imresize(R0,[220,160]); Ttest = func_yuchuli(R0re);%讀入數(shù)字 wordsss = sim(net,Ttest'); [V,I] = max(wordsss); %顯示識別結(jié)論 Icheck = imread(['facebase\',num2str(I-1),'.jpg']); subplot(224); imshow(Icheck); title('識別結(jié)論'); pause(0.5); end stop(vid) clc; clear; close all; warning off; addpath 'func\' addpath 'facebase\' I = imread('1.jpg'); %% %人臉跟蹤 [segment,f,R0,R1] = func_face_track(I); %獲得人臉區(qū)域 figure subplot(221); imshow(I); subplot(222); imshow(f); subplot(223); imshow(R1); title('臉部定位'); %% %人臉識別(測試前需要加入自己所要測試的人臉的相關(guān)庫。比如你要測試你自己的臉,那么需要加入你的臉道庫中) %人臉庫的離線訓(xùn)練 R0re = imresize(R0,[220,160]); Ttest = func_yuchuli(R0re);%讀入數(shù)字 load grnns.mat wordsss = sim(net,Ttest'); [V,I] = max(wordsss); %顯示識別結(jié)論 Icheck = imread(['facebase\',num2str(I-1),'.jpg']); subplot(224); imshow(Icheck); title('識別結(jié)論');
三、仿真測試結(jié)果
由此可以看出,當(dāng)選擇出學(xué)習(xí)樣本之后,GRNN網(wǎng)絡(luò)的結(jié)構(gòu)與權(quán)值都是完全確定的,因而訓(xùn)練GRNN網(wǎng)絡(luò)要比訓(xùn)練BP網(wǎng)絡(luò)和RBF網(wǎng)絡(luò)便捷得多。
到此這篇關(guān)于Matlab控制電腦攝像實(shí)現(xiàn)實(shí)時人臉檢測和識別詳解的文章就介紹到這了,更多相關(guān)Matlab人臉檢測識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言?struct結(jié)構(gòu)體超詳細(xì)講解
C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04C++實(shí)現(xiàn)快速排序(Quicksort)算法
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快速排序(Quicksort)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04c++ chrono 獲取當(dāng)前時間的實(shí)現(xiàn)代碼
這篇文章主要介紹了c++ chrono 獲取當(dāng)前時間的實(shí)現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型
虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型2016-06-06C語言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實(shí)例
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06