Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別-創(chuàng)新互聯(lián)

這篇文章主要講解了“Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別”吧!

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴(kuò)展宣傳的重要窗口,一個(gè)合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺(tái),創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都門簾成都網(wǎng)站設(shè)計(jì)公司、營銷型網(wǎng)站解決方案、網(wǎng)站設(shè)計(jì)等建站排名服務(wù)。

  1. 檢測人臉。這應(yīng)該是最基本的,給我們一張圖片,我們要先檢測出人臉的區(qū)域,然后才能

進(jìn)行操作,opencv已經(jīng)內(nèi)置了很多分類檢測器,我們這次用haar:

def detect_face(img):
 #將測試圖像轉(zhuǎn)換為灰度圖像,因?yàn)閛pencv人臉檢測器需要灰度圖像
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 #加載OpenCV人臉檢測分類器Haar
 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
 #檢測多尺度圖像,返回值是一張臉部區(qū)域信息的列表(x,y,寬,高)
 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
 # 如果未檢測到面部,則返回原始圖像
 if (len(faces) == 0):
 return None, None
 #目前假設(shè)只有一張臉,xy為左上角坐標(biāo),wh為矩形的寬高
 (x, y, w, h) = faces[0]
 #返回圖像的正面部分
 return gray[y:y + w, x:x + h], faces[0]

2.有了數(shù)據(jù)集和檢測人臉的功能后,我們就可以進(jìn)行預(yù)訓(xùn)練了,最后返回所有訓(xùn)練圖片的人臉檢測信息和標(biāo)簽:

# 該函數(shù)將讀取所有的訓(xùn)練圖像,從每個(gè)圖像檢測人臉并將返回兩個(gè)相同大小的列表,分別為臉部信息和標(biāo)簽
def prepare_training_data(data_folder_path):
 # 獲取數(shù)據(jù)文件夾中的目錄(每個(gè)主題的一個(gè)目錄)
 dirs = os.listdir(data_folder_path)
 # 兩個(gè)列表分別保存所有的臉部和標(biāo)簽
 faces = []
 labels = []
 # 瀏覽每個(gè)目錄并訪問其中的圖像
 for dir_name in dirs:
 # dir_name(str類型)即標(biāo)簽
 label = int(dir_name)
 # 建立包含當(dāng)前主題主題圖像的目錄路徑
 subject_dir_path = data_folder_path + "/" + dir_name
 # 獲取給定主題目錄內(nèi)的圖像名稱
 subject_images_names = os.listdir(subject_dir_path)
 # 瀏覽每張圖片并檢測臉部,然后將臉部信息添加到臉部列表faces[]
 for image_name in subject_images_names:
 # 建立圖像路徑
 image_path = subject_dir_path + "/" + image_name
 # 讀取圖像
 image = cv2.imread(image_path)
 # 顯示圖像0.1s
 cv2.imshow("Training on image...", image)
 cv2.waitKey(100)
 # 檢測臉部
 face, rect = detect_face(image)
 # 我們忽略未檢測到的臉部
 if face is not None:
 #將臉添加到臉部列表并添加相應(yīng)的標(biāo)簽
 faces.append(face)
 labels.append(label)
 cv2.waitKey(1)
 cv2.destroyAllWindows()
 #最終返回值為人臉和標(biāo)簽列表
 return faces, labels

3.有了臉部信息和對應(yīng)標(biāo)簽后,我們就可以使用opencv自帶的識(shí)別器來進(jìn)行訓(xùn)練了:

#調(diào)用prepare_training_data()函數(shù)
faces, labels = prepare_training_data("training_data")
#創(chuàng)建LBPH識(shí)別器并開始訓(xùn)練,當(dāng)然也可以選擇Eigen或者Fisher識(shí)別器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))

4.訓(xùn)練完畢后就可以進(jìn)行預(yù)測了,在這之前我們可以設(shè)定一下預(yù)測的格式,包括用矩形框框出人臉并標(biāo)出其名字,當(dāng)然最后別忘了建立標(biāo)簽與真實(shí)姓名直接的映射表:

#根據(jù)給定的(x,y)坐標(biāo)和寬度高度在圖像上繪制矩形
def draw_rectangle(img, rect):
 (x, y, w, h) = rect
 cv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)
# 根據(jù)給定的(x,y)坐標(biāo)標(biāo)識(shí)出人名
def draw_text(img, text, x, y):
 cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
#建立標(biāo)簽與人名的映射列表(標(biāo)簽只能為整數(shù))
subjects = ["jiaju", "jiaqiang"]

5.現(xiàn)在就可以定義我們的預(yù)測函數(shù)了:

# 此函數(shù)識(shí)別傳遞的圖像中的人物并在檢測到的臉部周圍繪制一個(gè)矩形及其名稱
def predict(test_img):
 #生成圖像的副本,這樣就能保留原始圖像
 img = test_img.copy()
 #檢測人臉
 face, rect = detect_face(img)
 #預(yù)測人臉
 label = face_recognizer.predict(face)
 # 獲取由人臉識(shí)別器返回的相應(yīng)標(biāo)簽的名稱
 label_text = subjects[label[0]]
 # 在檢測到的臉部周圍畫一個(gè)矩形
 draw_rectangle(img, rect)
 # 標(biāo)出預(yù)測的名字
 draw_text(img, label_text, rect[0], rect[1] - 5)
 #返回預(yù)測的圖像
 return img

6.最后使用我們test_data中的圖片進(jìn)行預(yù)測并顯示最終效果:

#加載測試圖像
test_img1 = cv2.imread("test_data/test1.jpg")
test_img2 = cv2.imread("test_data/test2.jpg")
#執(zhí)行預(yù)測
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)
#顯示兩個(gè)圖像
cv2.imshow(subjects[0], predicted_img1)
cv2.imshow(subjects[1], predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

來看看識(shí)別的結(jié)果:

Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別

這就是人臉識(shí)別最基本的流程,后續(xù)還會(huì)進(jìn)一步的研究,下一篇我們將討論本次實(shí)驗(yàn)的一些細(xì)節(jié)和注意事項(xiàng),算是對本篇的一次挖掘和總結(jié)吧。最后附上完整代碼:

# # -*- coding:utf-8 -*-
import cv2
import os
import numpy as np
# 檢測人臉
def detect_face(img):
 #將測試圖像轉(zhuǎn)換為灰度圖像,因?yàn)閛pencv人臉檢測器需要灰度圖像
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 #加載OpenCV人臉檢測分類器Haar
 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
 #檢測多尺度圖像,返回值是一張臉部區(qū)域信息的列表(x,y,寬,高)
 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
 # 如果未檢測到面部,則返回原始圖像
 if (len(faces) == 0):
 return None, None
 #目前假設(shè)只有一張臉,xy為左上角坐標(biāo),wh為矩形的寬高
 (x, y, w, h) = faces[0]
 #返回圖像的正面部分
 return gray[y:y + w, x:x + h], faces[0]
# 該函數(shù)將讀取所有的訓(xùn)練圖像,從每個(gè)圖像檢測人臉并將返回兩個(gè)相同大小的列表,分別為臉部信息和標(biāo)簽
def prepare_training_data(data_folder_path):
 # 獲取數(shù)據(jù)文件夾中的目錄(每個(gè)主題的一個(gè)目錄)
 dirs = os.listdir(data_folder_path)
 # 兩個(gè)列表分別保存所有的臉部和標(biāo)簽
 faces = []
 labels = []
 # 瀏覽每個(gè)目錄并訪問其中的圖像
 for dir_name in dirs:
 # dir_name(str類型)即標(biāo)簽
 label = int(dir_name)
 # 建立包含當(dāng)前主題主題圖像的目錄路徑
 subject_dir_path = data_folder_path + "/" + dir_name
 # 獲取給定主題目錄內(nèi)的圖像名稱
 subject_images_names = os.listdir(subject_dir_path)
 # 瀏覽每張圖片并檢測臉部,然后將臉部信息添加到臉部列表faces[]
 for image_name in subject_images_names:
 # 建立圖像路徑
 image_path = subject_dir_path + "/" + image_name
 # 讀取圖像
 image = cv2.imread(image_path)
 # 顯示圖像0.1s
 cv2.imshow("Training on image...", image)
 cv2.waitKey(100)
 # 檢測臉部
 face, rect = detect_face(image)
 # 我們忽略未檢測到的臉部
 if face is not None:
 #將臉添加到臉部列表并添加相應(yīng)的標(biāo)簽
 faces.append(face)
 labels.append(label)
 cv2.waitKey(1)
 cv2.destroyAllWindows()
 #最終返回值為人臉和標(biāo)簽列表
 return faces, labels
#調(diào)用prepare_training_data()函數(shù)
faces, labels = prepare_training_data("training_data")
#創(chuàng)建LBPH識(shí)別器并開始訓(xùn)練,當(dāng)然也可以選擇Eigen或者Fisher識(shí)別器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))
#根據(jù)給定的(x,y)坐標(biāo)和寬度高度在圖像上繪制矩形
def draw_rectangle(img, rect):
 (x, y, w, h) = rect
 cv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)
# 根據(jù)給定的(x,y)坐標(biāo)標(biāo)識(shí)出人名
def draw_text(img, text, x, y):
 cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
#建立標(biāo)簽與人名的映射列表(標(biāo)簽只能為整數(shù))
subjects = ["jiaju", "jiaqiang"]
# 此函數(shù)識(shí)別傳遞的圖像中的人物并在檢測到的臉部周圍繪制一個(gè)矩形及其名稱
def predict(test_img):
 #生成圖像的副本,這樣就能保留原始圖像
 img = test_img.copy()
 #檢測人臉
 face, rect = detect_face(img)
 #預(yù)測人臉
 label = face_recognizer.predict(face)
 # 獲取由人臉識(shí)別器返回的相應(yīng)標(biāo)簽的名稱
 label_text = subjects[label[0]]
 # 在檢測到的臉部周圍畫一個(gè)矩形
 draw_rectangle(img, rect)
 # 標(biāo)出預(yù)測的名字
 draw_text(img, label_text, rect[0], rect[1] - 5)
 #返回預(yù)測的圖像
 return img
#加載測試圖像
test_img1 = cv2.imread("test_data/test1.jpg")
test_img2 = cv2.imread("test_data/test2.jpg")
#執(zhí)行預(yù)測
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)
#顯示兩個(gè)圖像
cv2.imshow(subjects[0], predicted_img1)
cv2.imshow(subjects[1], predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

感謝各位的閱讀,以上就是“Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

本文名稱:Python中基于Opencv怎么實(shí)現(xiàn)人臉識(shí)別-創(chuàng)新互聯(lián)
新聞來源:http://muchs.cn/article4/eioie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、面包屑導(dǎo)航微信小程序、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作