鐘嘯 高紅梅
摘要:隨著信息和智能終端技術的發(fā)展,生物識別技術在各行各業(yè)中得到了廣泛的重視.人臉檢測與識別屬于非接觸型身份認證,只是看到臉部就可以實現(xiàn)身份的認證,因而被廣泛地應用在安保系統(tǒng)、企業(yè)公司、醫(yī)院學校、研究所等各類機構組織之中。本實驗基于特征臉的人臉識別方法,利用OpenCV的第三方庫和C++編程,實現(xiàn)了視頻流中的人臉識別技術,能夠在PC上檢測人臉和識別人臉。
關鍵詞:視頻流;人臉檢測;人臉捕獲;人臉識別;OpenCV
中圖分類號:TP37 文獻標識碼:A 文章編號:1009-3044(2018)25-0220-03
目前來說,生物識別技術雖早已有學者提出并實踐出來一些成果[1-3],而且已運用到各個應用領域并且影響廣泛。但是人臉識別技術方面還需要一些創(chuàng)新性思維和想法,也需要一些創(chuàng)新性想法來為后面的人臉識別技術添枝加葉,提供更多的參考,為以后人臉識別的發(fā)展和飛躍打下更多、更牢固的基礎。
1研究意義
一方面來說,研究視頻流中的人臉識別在一定程度上可以建實和發(fā)展人臉識別技術,為后續(xù)更高層次人臉識別技術的突破和發(fā)展打下一定的基礎。
另一方面,研究視頻流中的人臉識別方面有很大的實用和應用空間,可以用于公司職員日??记?,學校學生宿舍查寢等各個不同現(xiàn)實情景,總的來說此項目具有很大的發(fā)展和應用的空間。
2技術路線
早在2009年,就有學者總結出了人臉識別的方法[4-6],它們大致上可以歸結為三類:基于幾何特征的方法、基于模板的方法、基于模型的方法。本實驗選定基于模板的方法,利用基于特征臉的方法實現(xiàn)視頻流中的人臉識別技術。
3視頻流中的人臉識別系統(tǒng)設計
3.1技術支持
實現(xiàn)視頻流中的人臉識別技術,先要現(xiàn)視頻流中的人臉檢測和人臉捕獲。本實驗開發(fā)該原型系統(tǒng)所需要用到的開發(fā)工具有:SDK 8.1、VS 2015、Cmake、OpenCV等。(見圖1)
C++語言既能夠進行C語言面向過程的程序設計,還能夠進行以抽象數(shù)據(jù)類型為特點的基于對象的程序設計,還可以進行以封裝、繼承和多態(tài)為特點的面向對象的程序設計。C++語言不僅僅擁有計算機高效運行的實用性特征,同時它還致力于提高大規(guī)模程序的編程質量與程序設計語言的問題描述能力。所以,本實驗使用了C++語言作為該原型系統(tǒng)的編程語言。然后,本實驗需要下載和安裝SDK 8.1作為C++語言正常在電腦上運行的基本環(huán)境并配置好環(huán)境變量。
此項目還用到了OpenCV和Cmake。OpenCV由Intel微處理器研究實驗室的視覺交互組開發(fā),是一種用于數(shù)字圖像處理和計算機視覺的開源數(shù)據(jù)庫[7-8]。OpenCV是由C++語言編寫,它的主要接口也是C++語言。此外,OpenCV擁有包括500多個C函數(shù)的跨平臺的中、高層API。它不依賴于其他的外部庫,但它可以使用某些外部庫。本實驗需要下載OpenCV 3.3.1,并使用Cmake編譯它的動態(tài)鏈接庫和第三方庫。
3.2系統(tǒng)設計
根據(jù)實驗的目的,所要實現(xiàn)的功能,列出一個總設計框架(圖2)再用C++語言編寫出相關的程序代碼,用于開啟攝像頭、檢查攝像頭的運作情況、調用特征臉算法進行人臉識別。
3.3主要工作流程
使用者先要運行第一步程序,從視頻流中捕獲人臉的圖片,并按照指定路徑建立文件夾,作為人臉特征對比的后臺數(shù)據(jù)。之后,運行第二步程序,從視頻流中檢測出人臉并對其進行人臉特征提取,再與先前收集到的人臉數(shù)據(jù)照片進行特征對比,識別出該人臉。
4人臉識別關鍵技術的實現(xiàn)
4.1用Cmake編譯動態(tài)鏈接庫和第三方庫
本原型系統(tǒng)利用OpenCV的contrib模塊,該模塊包含了一些新型人臉識別,立體匹配,人工視網(wǎng)膜模型等可選功能。打開Cmake進入主頁面,在第一行源碼路徑中選擇OpenCV源碼的文件夾:OpenCV/OpenCV—master。再在第二行選擇生成路徑:OpenCV/OpenCV—master/build。然后點擊“Configure”,第一項選擇“Visual Studio 14 2015 Win64”作為編譯工具,點擊“Finish”完成。最后點擊“Generate”生成庫。同時,對OpenCV/OpenCV—contrib文件夾也是類似操作生成。
3.2攝像頭的開啟和檢查其運作情況
如上流程圖,本實驗先要用C++語言寫出攝像頭啟動和檢查其運作情況的代碼,該模塊代碼如下:
bool Handle::existsCapture() {
capture.open(0);
bool flag = false;
if (capture.isOpened()) {
flag = true;
cout << "檢測到攝像頭的存在,可以打開攝像頭" << endl;
capture.release();}
else {
cout << "未能夠檢測到攝像頭的存在,無法進行下一步的工作" << endl;}
return flag;}
3.3從視頻流中獲取圖片作為后臺數(shù)據(jù)
首先本實驗要實現(xiàn)從視頻流中獲取實時照片的功能,將所獲取的圖片作為人臉識別的后臺數(shù)據(jù),用于與視頻流中的人臉特征做對比,該模塊代碼如下:
Mat frame;
Mat des;
int i = 1;
while (capture.read(frame)) {
char ch = waitKey(20);
findFaces(frame, des);
imshow("人臉檢測", frame);
//waitKey(5);
bool flag = false;
switch (ch) {
case 'p':
if (flag) {
if (des.rows>0 && des.cols>0) {
cout << "aaaaaaaaaaaaaa" << endl;
string name = format("D:\\opencv\\img\\002\\%d.jpg", i);
imwrite(name, des);
cout << "save photo:" << name << endl;
i++;
break;
}}
else
{if (des.rows>0 && des.cols>0) {
distinguish(des);}}}}}
3.4視頻流中的人臉檢測與人臉特征提取
首先本實驗要實現(xiàn)從視頻流中檢測出人臉并提取人臉的特征進行特征臉的記錄,用于人臉數(shù)據(jù)的記錄和為下一步進行人臉特征的對比和識別提供了基本對比數(shù)據(jù),該模塊代碼如下:
//繪制矩形 BGR。
rectangle(frame, faces[i], Scalar(0, 0, 255), 1);
//獲取矩形中心點。
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
//繪制圓形。
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
//獲取臉部矩形區(qū)域。
Mat faceROI = src(faces[i]);
//存儲找到的眼睛矩形。
std::vector
eyes_cascade.detectMultiScale(faceROI,eyes,1.1,2,0 |CASCADE_SCALE_IMAGE,Size(30,30));
for(size_t j=0;j {Point eye_center(faces[i].x + eyes[j].x + eyes[j].width/2,faces[i].y + eyes[j].y + eyes[j].height/2); int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); circle(frame,eye_center,radius,Scalar( 255, 0, 0 ),4,8,0);} //截取人臉。 Mat facesROI = frame(faces[i]); //圖像縮放。 cv::resize(facesROI, facesROI, Size(128, 128), 0, 0, cv::INTER_LINEAR); //保存圖像。 dst = facesROI;} return;} 3.5視頻流中的人臉特征對比與人臉識別 最后本實驗要實現(xiàn)從視頻流中捕獲人臉,提取人臉特征并與后臺人臉數(shù)據(jù)做對比進行人臉的識別,該模塊代碼如下: map vector vector vector int count = 0; for (int i = 0; i if (res[i].find_last_of(".pgm") != -1) { Mat mat = imread(res[i], CV_LOAD_IMAGE_GRAYSCALE); resize(mat, mat, Size(128, 128)); images.push_back(mat); labels.push_back(count);} else { count++; cout << "index:" << count << " " << res[i] << endl; textRes.insert(pair 5總結與展望 作為一個學習計算機軟件的學生來說,我自身的讀代碼和寫代碼的能力顯著提高。除此之外,我還學會使用OpenCV、Cmake等一系列工具,對經(jīng)典的隱馬爾可夫模型有了一定認識和了解,對人臉識別技術有了深層次地了解和掌握。我開發(fā)的人臉識別原型系統(tǒng)的人臉識別率達到85%以上,顯然識別率已經(jīng)達到一定的水準,但是原型系統(tǒng)并不完美,經(jīng)過大量的人臉訓練,我通過改變人臉識別的背景、環(huán)境的光照亮暗、人臉的角度等等一系列因素,發(fā)現(xiàn)人臉識別率受人臉識別的背景影響較大,實驗說明在不同背景下,人臉識別率才達到50%,但可以通過優(yōu)化編程代碼彌補這一不足。實驗還可以做出進一步的延伸,就是研究不同民族的人臉特征,找出不同名族臉部的特點并用幾何向量計算并總結出來,由此實現(xiàn)一個額外的功能,就是該系統(tǒng)可以識別人臉所屬的民族。 參考文獻: [1] 劉芳.基于FpGA的門禁系統(tǒng)視頻監(jiān)控中的人臉識別技術研究[J].智能應用,2014(4). [2] 馬海兵,白潔.人臉識別技術在智能視頻監(jiān)控系統(tǒng)中的應用[J].現(xiàn)代電子技術,2007(8). [3] 姜濤.基于OpenCV的智能視頻監(jiān)控系統(tǒng)設計[D].江蘇科技大學, [4] 馬小虎,譚延琪.基于鑒別稀疏保持嵌入的人臉識別算法[J].自動化學報, 2014, 40(1): 73-82 [5] 吳巾一,周德龍.人臉識別方法綜述[J].計算機應用研究,2009(8). [6] 孟繁靜,王連明.視頻人臉識別系統(tǒng)中的最佳人臉捕獲[J].東北師大學報,2015(4). [7] 黃佳.基于OpenCV的計算機視覺技術研究[D].華東理工大學,2013. [8] 唐致龍.基于OpenCV嵌入式人臉檢測系統(tǒng)[D].長安大學,2017. 【通聯(lián)編輯:唐一東】