1.研究背景與意義
隨著計算機科學(xué)和人工智能的快速發(fā)展,人臉識別技術(shù)成為了一個備受關(guān)注的研究領(lǐng)域。人臉識別系統(tǒng)是一種通過計算機視覺和模式識別技術(shù)來識別和驗證人臉的系統(tǒng)。它在安全監(jiān)控、人機交互、身份認證等領(lǐng)域具有廣泛的應(yīng)用前景。
在過去的幾十年里,人臉識別技術(shù)取得了長足的進步。早期的人臉識別系統(tǒng)主要基于傳統(tǒng)的圖像處理算法,如特征提取、模式匹配等。然而,這些方法在復(fù)雜的環(huán)境下往往表現(xiàn)不佳,容易受到光照、姿態(tài)、表情等因素的干擾。近年來,隨著深度學(xué)習(xí)的興起,基于深度神經(jīng)網(wǎng)絡(luò)的人臉識別方法取得了顯著的突破,成為當(dāng)前最先進的技術(shù)。
OpenCV是一個開源的計算機視覺庫,提供了豐富的圖像處理和機器學(xué)習(xí)算法。它支持多種編程語言,如C++、Python等,具有廣泛的應(yīng)用領(lǐng)域?;贠penCV的人臉識別系統(tǒng)可以利用其強大的圖像處理和模式識別功能,實現(xiàn)高效準確的人臉檢測、特征提取和匹配。
基于OpenCV的人臉識別系統(tǒng)具有許多重要的應(yīng)用。首先,它可以應(yīng)用于安全監(jiān)控領(lǐng)域。通過將人臉識別技術(shù)與監(jiān)控攝像頭相結(jié)合,可以實現(xiàn)對特定人員的實時監(jiān)測和識別,從而提高安全性和防范能力。其次,人臉識別系統(tǒng)可以應(yīng)用于人機交互領(lǐng)域。通過識別用戶的面部表情和動作,系統(tǒng)可以實現(xiàn)更加智能化的交互方式,提供更好的用戶體驗。此外,人臉識別系統(tǒng)還可以應(yīng)用于身份認證和訪問控制領(lǐng)域。通過對人臉進行識別和驗證,可以實現(xiàn)更加安全可靠的身份認證方式,避免了傳統(tǒng)的密碼和卡片等易被盜用的問題。
然而,基于OpenCV的人臉識別系統(tǒng)仍然面臨一些挑戰(zhàn)和問題。首先,人臉識別技術(shù)在復(fù)雜的環(huán)境下仍然存在一定的誤識別率和漏識別率。光照、姿態(tài)、表情等因素對人臉識別的準確性和穩(wěn)定性有著重要影響。其次,大規(guī)模人臉數(shù)據(jù)庫的管理和搜索也是一個具有挑戰(zhàn)性的問題。隨著人臉識別技術(shù)的發(fā)展,人臉數(shù)據(jù)庫的規(guī)模不斷增大,如何高效地管理和搜索這些數(shù)據(jù)成為了一個重要的研究方向。
因此,基于OpenCV的人臉識別系統(tǒng)的研究具有重要的意義。通過深入研究和改進人臉識別算法,可以提高系統(tǒng)的準確性和穩(wěn)定性,拓展其應(yīng)用領(lǐng)域。同時,研究人臉數(shù)據(jù)庫的管理和搜索方法,可以提高系統(tǒng)的效率和可擴展性。基于OpenCV的人臉識別系統(tǒng)的發(fā)展將為安全監(jiān)控、人機交互、身份認證等領(lǐng)域帶來更加智能化和便捷化的解決方案,推動社會的進步和發(fā)展。
2.圖片演示



3.視頻演示
基于Mysql和OpenCV的人臉識別系統(tǒng)(源碼和部署教程)_嗶哩嗶哩_bilibili
4. Qt 和 OpenCV 簡介
Q是在1991年奇趣科技開發(fā)的基于C++的面向?qū)ο蟮囊环N編寫界面的框架[9.3]。雖然它比微軟的 MFC晚出來很久并且沒有大型公司提供支持,但是其開源性使得一大批程序員自發(fā)地對其進行設(shè)計和優(yōu)化,經(jīng)過多年的發(fā)展變的十分強大,而且也越來越得到企業(yè)的認可。Qt還是一款可以跨平臺的界面設(shè)計軟件,在其下支持多種操作系統(tǒng),具有很強的可移植性。Qt的體積相對比較輕巧,可以根據(jù)自己的需求添加一些庫資源來使用,十分方便。Qt Creator是一款更為輕巧的Qt平臺開發(fā)環(huán)境,具有集成的IDE使得程序員可以快速的上手,它可以通過編程實現(xiàn)界面的設(shè)計,也可以通過拖拉控件的形式實現(xiàn)界面的設(shè)計,十分人性化,可滿足個人的喜好要求。它還提供了很多高效的工具,例如編輯器、調(diào)試器、項目管理和上下文感知系統(tǒng)等。
OpenCV是一些處理圖像的庫的結(jié)合體[1],它擁有全部的源碼和各類平臺編譯器從而支持多種平臺操作系統(tǒng),例如普通個人計算機 (Windows,Linux,Mac)、手機(Andriod,IOS)以及可以兼容Java等多種語言。它由高效的C和C++構(gòu)成了一系列開源的通用算法和實用API函數(shù)接口,而且?guī)椭臋n強大并對一些基本功能提供了示例程序供開發(fā)人員參考,方便二次開發(fā)等。
OpenCV的內(nèi)部結(jié)構(gòu)主要是一些庫和接口,包含一些單一的圖像處理功能和復(fù)雜的目標檢測等。我們可以整合這些模塊來實現(xiàn)自定義的功能,也可以讀計算法進行修改重新編譯再使用,非常靈活[2],其模塊化的結(jié)構(gòu)如圖所示。


5.核心代碼講解
5.1 config.py
根據(jù)給定的代碼,可以將其封裝為一個名為"EmotionDetection"的類,包含以下核心部分:
class EmotionDetection:
def __init__(self):
self.path_model = 'emotion_detection/Modelos/model_dropout.hdf5'
self.w, self.h = 48, 48
self.rgb = False
self.labels = ['angry', 'disgust', 'fear', 'happy', 'neutral', 'sad', 'surprise']
def detect_emotion(self, image):
# 實現(xiàn)情感檢測的代碼
pass
class FaceRecognition:
def __init__(self):
self.path_images = "images_db"
def recognize_face(self, image):
# 實現(xiàn)人臉識別的代碼
pass
這樣,我們可以使用EmotionDetection類來進行情感檢測,使用FaceRecognition類來進行人臉識別。
這個config.py文件主要用于配置兩個模塊:emotion_detection(情緒檢測)和face_recognition(人臉識別)。
在emotion_detection模塊中,配置了以下參數(shù):
- path_model:情緒檢測模型的路徑,這里設(shè)置為'emotion_detection/Modelos/model_dropout.hdf5'。
- w,h:模型輸入圖片的寬度和高度,這里設(shè)置為48。
- rgb:是否將圖片轉(zhuǎn)換為RGB格式,這里設(shè)置為False,即將圖片轉(zhuǎn)換為灰度圖。
- labels:情緒類別的標簽,包括'angry'(憤怒)、'disgust'(厭惡)、'fear'(恐懼)、'happy'(快樂)、'neutral'(中性)、'sad'(悲傷)和'surprise'(驚訝)。
在face_recognition模塊中,配置了以下參數(shù):
- path_images:存放人臉圖像的文件夾路徑,這里設(shè)置為"images_db"。
5.2 deep_face.py
from deepface import DeepFace
class FaceAnalyzer:
def __init__(self, image_path):
self.image_path = image_path
def analyze_face(self):
demography = DeepFace.analyze(self.image_path, actions=['age', 'gender', 'race', 'emotion'])
return demography
image_path = "juan.jpg"
analyzer = FaceAnalyzer(image_path)
demography = analyzer.analyze_face()
print("Age: ", demography["age"])
print("Gender: ", demography["gender"])
print("Emotion: ", demography["dominant_emotion"])
print("Race: ", demography["dominant_race"])
這個程序文件名為deep_face.py,它使用了deepface庫來進行人臉分析。程序首先導(dǎo)入DeepFace類,然后使用analyze方法對指定的圖片進行分析,包括年齡、性別、種族和情緒等方面的分析。接著打印出分析結(jié)果中的年齡、性別、主要情緒和主要種族信息。
5.3 Face_info.py
以下是將代碼封裝為類的核心部分:
class FaceInfo:
def __init__(self, input_type, image_path):
self.input_type = input_type
self.image_path = image_path
def process_image(self):
frame = cv2.imread(self.image_path)
out = f_Face_info.get_face_info(frame)
res_img = f_Face_info.bounding_box(out, frame)
cv2.imshow('Face info', res_img)
cv2.waitKey(0)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Face Info")
parser.add_argument('--input', type=str, default='webcam', help="webcam or image")
parser.add_argument('--path_im', type=str, help="path of image")
args = vars(parser.parse_args())
face_info = FaceInfo(args['input'], args['path_im'])
face_info.process_image()
這個類接受兩個參數(shù):input_type和image_path,用于指定輸入類型和圖像路徑。process_image方法加載圖像,獲取人臉信息,并繪制邊界框。最后,通過FaceInfo類的實例來調(diào)用process_image方法。
這個程序文件名為Face_info.py,它的功能是使用OpenCV和imutils庫來檢測人臉并顯示人臉信息。程序首先導(dǎo)入了f_Face_info模塊,然后導(dǎo)入了cv2、time、imutils和argparse庫。
接下來,程序使用argparse庫創(chuàng)建了一個命令行參數(shù)解析器,用于指定輸入類型和圖像路徑。默認情況下,輸入類型為webcam,即使用攝像頭作為輸入。如果指定了--input參數(shù)為image,則需要提供--path_im參數(shù)來指定圖像路徑。
然后,程序讀取了一張圖像文件,路徑為'./images/1 (2).jpg'。接著,調(diào)用f_Face_info模塊的get_face_info函數(shù)來獲取圖像中的人臉信息。然后,調(diào)用f_Face_info模塊的bounding_box函數(shù)來在圖像上繪制人臉邊界框。最后,使用cv2.imshow函數(shù)顯示處理后的圖像,并使用cv2.waitKey函數(shù)等待用戶按下鍵盤任意鍵關(guān)閉窗口。
5.4 f_Face_info.py
class FaceRecognition:
def __init__(self):
self.rec_face = f_main.rec()
def get_face_info(self, im):
boxes_face = face_recognition.face_locations(im)
out = []
if len(boxes_face) != 0:
for box_face in boxes_face:
box_face_fc = box_face
x0, y1, x1, y0 = box_face
box_face = np.array([y0, x0, y1, x1])
face_features = {
"name": [],
"bbx_frontal_face": box_face
}
face_image = im[x0:x1, y0:y1]
face_features["name"] = self.rec_face.recognize_face2(im, [box_face_fc])[0]
out.append(face_features)
else:
face_features = {
"name": [],
"bbx_frontal_face": []
}
out.append(face_features)
return out
def bounding_box(self, out, img):
for data_face in out:
box = data_face["bbx_frontal_face"]
if len(box) == 0:
continue
else:
x0, y0, x1, y1 = box
img = cv2.rectangle(img,
(x0, y0),
(x1, y1),
(0, 0, 255), 2)
thickness = 2
fontSize = 0.6
step = 13
try:
cv2.putText(img, "name: " + data_face["name"], (x0, y0 - step - 7), cv2.FONT_HERSHEY_SIMPLEX,
fontSize, (0, 255, 0), thickness)
except:
pass
return img
這個程序文件名為f_Face_info.py,它包含了一些函數(shù)和庫的導(dǎo)入。主要功能是通過人臉識別來獲取人臉信息并在圖像上繪制邊界框和標簽。
程序首先導(dǎo)入了cv2、numpy和face_recognition等庫,并從my_face_recognition模塊中導(dǎo)入了f_main.rec()函數(shù)。
接下來定義了一個名為get_face_info的函數(shù),它接受一個圖像作為輸入,并使用face_recognition庫的face_locations函數(shù)來檢測人臉位置。如果檢測到人臉,則對每個人臉進行處理,提取人臉圖像并使用rec_face.recognize_face2函數(shù)識別人臉。最后將人臉信息存儲在一個列表中并返回。
然后定義了一個名為bounding_box的函數(shù),它接受一個包含人臉信息的列表和一個圖像作為輸入。該函數(shù)遍歷人臉信息列表,對每個人臉繪制邊界框和標簽,并返回繪制完成的圖像。
整個程序的功能是通過人臉識別來獲取人臉信息,并在圖像上繪制邊界框和標簽。
5.5 f_Face_info2.py
class FaceRecognition:
def __init__(self):
self.rec_face = self.rec()
def rec(self):
# 實例化人臉檢測器
pass
def get_face_info(self, im):
# 人臉檢測
pass
def bounding_box(self, out, img):
# 繪制邊界框和標簽
pass
這個程序文件名為f_Face_info2.py,它的功能是通過人臉識別獲取人臉信息并在圖像上標注人臉邊界框和人臉姓名。程序中導(dǎo)入了cv2、numpy和face_recognition等庫,并從my_face_recognition模塊中導(dǎo)入了f_main.rec()函數(shù)。
程序定義了一個名為get_face_info的函數(shù),該函數(shù)接受一個圖像作為輸入,并使用face_recognition庫進行人臉檢測。如果檢測到人臉,則將人臉的位置信息和姓名信息存儲在一個字典中,并將該字典添加到一個列表中。最后,將列表作為輸出返回。
程序還定義了一個名為bounding_box的函數(shù),該函數(shù)接受一個包含人臉信息的列表和一個圖像作為輸入。函數(shù)遍歷人臉信息列表,根據(jù)人臉邊界框的位置在圖像上繪制矩形框,并在框上方顯示人臉姓名。
整個程序的目的是通過人臉識別獲取人臉信息,并在圖像上標注人臉邊界框和姓名。
5.6 info.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog_info(object):
def setupUi(self, Dialog_info):
Dialog_info.setStyleSheet("background-color: rgb(189,215,238)")
Dialog_info.setObjectName("Dialog_info")
Dialog_info.resize(394, 500)
self.button_confirm = QtWidgets.QPushButton(Dialog_info)
self.button_confirm.setGeometry(QtCore.QRect(260, 452, 112, 34))
self.button_confirm.setObjectName("button_confirm")
self.formLayoutWidget = QtWidgets.QWidget(Dialog_info)
self.formLayoutWidget.setGeometry(QtCore.QRect(40, 50, 331, 400))
self.formLayoutWidget.setObjectName("formLayoutWidget")
self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
self.formLayout.setContentsMargins(0, 0, 0, 0)
self.formLayout.setObjectName("formLayout")
self.label = QtWidgets.QLabel(self.formLayoutWidget)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_2.setObjectName("label_2")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_2)
self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_3.setObjectName("label_3")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_3)
self.label_4 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_4.setObjectName("label_4")
self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_4)
self.label_5 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_5.setObjectName("label_5")
self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.label_5)
self.label_6 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_6.setObjectName("label_6")
self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.label_6)
self.label_7 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_7.setObjectName("label_7")
self.formLayout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.label_7)
self.label_8 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_8.setObjectName("label_8")
self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.label_8)
self.label_9 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_9.setObjectName("label_9")
self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.label_9)
self.line_id = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_id.setObjectName("line_id")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.line_id)
self.line_name = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_name.setObjectName("line_name")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.line_name)
self.line_sex = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_sex.setObjectName("line_sex")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.line_sex)
self.line_address = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_address.setObjectName("line_address")
self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.line_address)
self.line_passwords = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_passwords.setObjectName("line_passwords")
self.formLayout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.line_passwords)
self.line_age = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_age.setObjectName("line_name")
self.formLayout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.line_age)
self.line_race = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_race.setObjectName("line_race")
self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.line_race)
self.line_emotion = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_emotion.setObjectName("line_emotion")
self.formLayout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.line_emotion)
self.line_check = QtWidgets.QLineEdit(self.formLayoutWidget)
self.line_check.setObjectName("line_check")
self.formLayout.setWidget(11, QtWidgets.QFormLayout.FieldRole, self.line_check)
self.retranslateUi(Dialog_info)
QtCore.QMetaObject.connectSlotsByName(Dialog_info)
Dialog_info.setTabOrder(self.line_id, self.line_name)
Dialog_info.setTabOrder(self.line_name, self.line_sex)
Dialog_info.setTabOrder(self.line_sex, self.line_address)
Dialog_info.setTabOrder(self.line_address, self.line_passwords)
Dialog_info.setTabOrder(self.line_passwords, self.line_age)
Dialog_info.setTabOrder(self.line_age, self.line_race)
Dialog_info.setTabOrder(self.line_race, self.line_emotion)
Dialog_info.setTabOrder(self.line_emotion, self.line_check)
def retranslateUi(self, Dialog_info):
_translate = QtCore.QCoreApplication.translate
Dialog_info.setWindowTitle(_translate("Dialog_info", "Information Details"))
self.button_confirm.setText(_translate("Dialog_info", "Determine"))
self.label.setText(_translate("Dialog_input", "Name:"))
self.label_2.setText(_translate("Dialog_input", "Student ID*:"))
self.label_3.setText(_translate("Dialog_input", "Gender:"))
self.label_4.setText(_translate("Dialog_input", "Native place:"))
self.label_5.setText(_translate("Dialog_input", "Password:"))
self.label_6.setText(_translate("Dialog_input", "Age:"))
self.label_7.setText(_translate("Dialog_input", "Race:"))
self.label_8.setText(_translate("Dialog_input", "Time:"))
self.label_9.setText(_translate("Dialog_input", "Sign status:"))
這是一個名為info.py的程序文件,它是一個使用PyQt5生成的用戶界面文件。該文件定義了一個名為Ui_Dialog_info的類,該類用于設(shè)置和顯示一個信息對話框。
該對話框的背景顏色為rgb(189,215,238),大小為394x500像素。對話框中包含一個確認按鈕和一個表單布局,表單布局中包含了一些標簽和文本框。
標簽包括姓名、學(xué)生ID、性別、籍貫、密碼、年齡、種族、時間。對應(yīng)的文本框用于輸入相應(yīng)的信息。
除了設(shè)置界面布局和文本內(nèi)容外,該文件還定義了一些與界面交互的方法和信號槽連接。
該文件的目的是為了創(chuàng)建一個信息對話框,用于輸入和顯示一些個人信息。
6.系統(tǒng)整體結(jié)構(gòu)
整體功能和構(gòu)架概述:
該工程涉及人臉識別和信息管理的功能。主要包括以下模塊:
- 人臉識別模塊:使用深度學(xué)習(xí)模型進行人臉分析,包括年齡、性別、種族和情緒等方面的分析。
- 人臉信息獲取模塊:通過人臉識別獲取人臉信息,并在圖像上標注人臉邊界框和姓名。
- 信息管理模塊:提供一個用戶界面,用于輸入和顯示個人信息。
下面是每個文件的功能整理:
| 文件名 | 功能 |
|---|---|
| config.py | 配置情緒檢測和人臉識別模塊的參數(shù) |
| deep_face.py | 使用deepface庫進行人臉分析,包括年齡、性別、種族和情緒等方面的分析 |
| Face_info.py | 使用OpenCV和imutils庫檢測人臉并顯示人臉信息 |
| f_Face_info.py | 通過人臉識別獲取人臉信息并在圖像上繪制邊界框和標簽 |
| f_Face_info2.py | 通過人臉識別獲取人臉信息并在圖像上標注人臉邊界框和姓名 |
| info.py | 創(chuàng)建一個信息對話框,用于輸入和顯示個人信息 |
| input_dialog.py | 創(chuàng)建一個輸入對話框,用于輸入用戶名和密碼 |
| login2.py | 創(chuàng)建一個登錄界面,用于用戶登錄 |
| ui.py | 創(chuàng)建一個用戶界面,用于顯示和管理個人信息 |
| my_face_recognition\f_face_recognition.py | 人臉識別模塊,包括人臉檢測和人臉特征提取 |
| my_face_recognition\f_main.py | 人臉識別模塊的主要功能,包括人臉識別和人臉信息存儲 |
| my_face_recognition\f_storage.py | 人臉信息存儲模塊,用于存儲和管理人臉信息 |
以上是對每個文件功能的簡要概括,具體的實現(xiàn)細節(jié)可能需要查看每個文件的代碼來進一步了解。
7.人臉識別模塊設(shè)計
人臉識別技術(shù)的研究最早是由 Bledsoe在一篇技術(shù)報告中提出的,該報告以人臉特征點的距離、比率等參數(shù)作為人臉特征,搭建了一個半自動的人臉識別系統(tǒng)。之后在各國學(xué)者的共同努力下,人臉識別技術(shù)得到了不停的優(yōu)化和改進,逐漸發(fā)展和成熟,從而在社會生活中得到廣泛的應(yīng)用。
目前國內(nèi)外研究較為廣泛的人臉識別方法有:(1)基于臉部幾何特征的人臉識別方法;(2)基于特征臉的人臉識別方法;(3)基于神經(jīng)網(wǎng)絡(luò)的人臉識別方法;(4)基于局部特征的人臉識別方法;(5)基于彈性匹配的人臉識別方法等。本文采用基于特征臉的人臉識別方法。
一、基于PCA的人臉識別算法
PCA是一種常用的數(shù)據(jù)分析方法[6-8],它的原理是將原始數(shù)據(jù)轉(zhuǎn)化成線性無關(guān)的維度表示,提取主要的特征分量并進行降維從而達到模型簡化的效果,其廣泛應(yīng)用在一些數(shù)學(xué)計算領(lǐng)域。
該方法的中心思想就是找出人臉圖像重要部分來進行一個轉(zhuǎn)化投影,獲得直觀易計算的量,把不相干內(nèi)容去掉。識別也是先進行轉(zhuǎn)化再與前者對比來判斷系數(shù)的大小看是否是同一個人。具體的實現(xiàn)是以K-L變換為主將要訓(xùn)練的人臉庫轉(zhuǎn)化成特征臉空間并投影,將高維向量轉(zhuǎn)化為低維向量。識別過程是將人臉區(qū)域投影到前面的特征臉空間來獲得每個測試樣本的特征系數(shù),再將該值與訓(xùn)練樣本的投影值進行比較獲得可信度來判斷其身份。該方法從人臉庫訓(xùn)練和識別都不是很復(fù)雜且速度和識別率較高。
K-L變換的存在就是為了將龐大的數(shù)據(jù)簡單化,即在這些數(shù)據(jù)中舍棄不必要的數(shù)據(jù)而篩選出重要的數(shù)據(jù)。主要是找到一個矩陣,讓原來樣本矩陣乘以這個找到的矩陣以獲得一個新的矩陣,這個新的矩陣就比原來樣本的矩陣少了許多維度,即完成了數(shù)據(jù)的篩選和達到降維的目的。在實際應(yīng)用中,在進行K-L變換時所做的一些工作計算量還是比較大的,所以需要再引入奇異值分解的方法來輔助和簡化協(xié)方差矩陣的特征向量,具體原理和過程如下:

8.MySQL 數(shù)據(jù)庫設(shè)計
在上面己經(jīng)設(shè)計好了監(jiān)控界凹、管理,所以為了視頻監(jiān)控后續(xù)更方健的直看以但是還沒有對這些功能進行統(tǒng)一的歸納管理,所以為了視頻監(jiān)及管理,本系統(tǒng)引入了MySQL數(shù)據(jù)庫,具體結(jié)構(gòu)如下圖所示。

9.系統(tǒng)整合

參考博客《基于Mysql和OpenCV的人臉識別系統(tǒng)(源碼和部署教程)》
10.參考文獻
[1]廖文軍.基于連續(xù)Adaboost算法的多角度人臉檢測技術(shù)研究與實現(xiàn)[J].南京郵電大學(xué).2012.DOI:10.7666/d.d209228.
[2]李友坤.BP神經(jīng)網(wǎng)絡(luò)的研究分析及改進應(yīng)用[D].2012.
[3]趙曉輝.基于改進的分塊LBP人臉識別算法研究[D].2012.
[4]張惠發(fā).人臉識別的關(guān)鍵問題研究[D].2012.
[5]褚勤.基于小波分析和支持向量機的人臉識別方法研究[D].2012.