/************************************************************************** 人臉識別,近年來是研究的熱點,若是深究的話,其中涵蓋的知識是不少.並且以人臉識別爲題目 的本科畢業設計,愈來愈受到本科老師的青睞,本實驗是利用opencv基於Eigenfaces特徵臉和 Fisherfaces算法,咱們想要識別人臉,天然就要製做一個真的人臉,經過這個實驗咱們能夠實現 一個簡易的人臉識別算法,也算是研究人臉識別入門的必經之路吧.我接下來,若是有時間的話, 我將利用QT作我的臉識別應用程序(先立個flag,怕本身偷懶,怕困難不作),給它加一個華麗麗的 界面. ************************************************************************/
/********************************************************************* 人臉的數據集,能夠本身製做,也能夠去網上自行下載,這裏推薦一個download,同時若是是 想要識別本身的臉,天然數據集裏要包含有本身的臉,咱們還要製做本身的人臉集合. *********************************************************************/
/********************************************************************** 下面是咱們下載下來的背景數據集合,一共有40個,每一個有10我的,分別以s1-s40文件夾存放 於orl_faces中.須要注意的是數據集合中的圖片都是pgm格式的,在Ubuntu系統下能夠直接 打開,在windows下能夠利用opencv的imread函數打開.另外咱們還要看一下背景數據集 的人臉照片是多大的,檢查看是92x112,記住這個尺寸,由於咱們製做的本身的人臉一樣是需 要這個大小的尺寸. *********************************************************************/
[部分背景數據集展現]html
/*********************************************************************** 咱們利用加載人臉檢測器的方法,打開電腦攝像頭,而且利用opencv中resize()函數將識別到 的人臉圖像自動改變尺寸爲92x112,並經過imwrite函數將resize()事後的圖片保存到背景數據 集所在的位置,存放於s41文件夾中.具體代碼實現以下: ***********************************************************************/
#include "opencv2/objdetect.hpp" #include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> #include <stdio.h>
using namespace std; using namespace cv; int main() { CascadeClassifier facecascade; facecascade.load("models/lbpcascade_frontalface.xml"); //人臉檢測器(快速的LBP)
VideoCapture capture; capture.open(0); Mat frame; //定義一個Mat變量,用於存儲每一幀的圖像
int pic_count = 1; while(1) { capture >> frame; //讀取當前幀
std::vector<Rect> faces; Mat frameGray; cvtColor(frame,frameGray,COLOR_BGR2GRAY); facecascade.detectMultiScale(frameGray,faces, 1.1, 4, 0, Size(100, 100), Size(500,500)); for(size_t i = 0; i < faces.size(); i++) { rectangle(frame, faces[i], Scalar(0, 255, 0), 2, 8, 0); } if(faces.size() == 1) { Mat faceROI = frameGray(faces[0]); Mat myFace; resize(faceROI, myFace,Size(92,112)); putText(frame, to_string(pic_count), faces[0].tl(), FONT_HERSHEY_DUPLEX, 1.2, Scalar(71, 99, 255), 2, LINE_8); string filename = format("orl_faces/s41/%d.jpg", pic_count); imwrite(filename, myFace); imshow(filename,myFace); waitKey(500); destroyWindow(filename); pic_count++; if(pic_count == 21) { return 0; } } imshow("frame",frame); waitKey(100); } return 0; }
/******************************************************************** 由於在寫人臉模型訓練程序時,須要讀取人臉和人臉對應的標籤,若直接在數據庫讀取效率是很 的,所以咱們能夠利用csv文件讀取,在訓練以前須要生成csv文件,其內容包含如下兩個部分: 1.每一張圖片對應的位置 1.同一我的臉對應的標籤 咱們能夠利用利用opencv官方提供的python腳本自動生成,具體程序以下: *******************************************************************/
#!/usr/bin/env python import sys import os.path if __name__ == "__main__": #if len(sys.argv) != 2: # print "usage: create_csv <base_path>" # sys.exit(1) #BASE_PATH=sys.argv[1] BASE_PATH="orl_faces" SEPARATOR=";" fh = open("at.txt",'w') for dirname, dirnames, filenames in os.walk(BASE_PATH): for subdirname in dirnames: subject_path = os.path.join(dirname, subdirname) for filename in os.listdir(subject_path): subdirname2 = subdirname[::-1] subdirname3 = subdirname2[:-1] subdirname4 = subdirname3[::-1] #print subdirname2[:-1] label = int(subdirname4) abs_path = "%s/%s" % (subject_path, filename) print "%s%s%d" % (abs_path, SEPARATOR, label) fh.write(abs_path) fh.write(SEPARATOR) fh.write(str(label)) fh.write("\n") label = label + 1 fh.close()
[生成的at.txt文件部分展現]python