日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

opencv 人脸识别_Python学习:基于Opencv来快速实现人脸识别(完整版)

發布時間:2025/3/19 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 人脸识别_Python学习:基于Opencv来快速实现人脸识别(完整版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隨著人工智能的日益火熱,計算機視覺領域發展迅速,尤其在人臉識別或物體檢測方向更為廣泛,今天就為大家帶來最基礎的人臉識別基礎,從一個個函數開始走進這個奧妙的世界。

首先看一下本實驗需要的數據集,為了簡便我們只進行兩個人的識別,選取了beyond樂隊的主唱黃家駒和貝斯手黃家強,這哥倆長得有幾分神似,這也是對人臉識別的一個考驗:

兩個文件夾,一個為訓練數據集,一個為測試數據集,訓練數據集中有兩個文件夾0和1,之前看一些資料有說這里要遵循“slabel”命名規則,但后面處理起來比較麻煩,因為目前opencv接受的人臉識別標簽為整數,那我們就直接用整數命名吧:

為了方便,我們每個人用20張照片來訓練,0代表黃家駒,1代表黃家強:

開始啦:

  • 檢測人臉。這應該是最基本的,給我們一張圖片,我們要先檢測出人臉的區域,然后才能
  • 進行操作,opencv已經內置了很多分類檢測器,我們這次用haar:

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

    2.有了數據集和檢測人臉的功能后,我們就可以進行預訓練了,最后返回所有訓練圖片的人臉檢測信息和標簽:

    # 該函數將讀取所有的訓練圖像,從每個圖像檢測人臉并將返回兩個相同大小的列表,分別為臉部信息和標簽 def prepare_training_data(data_folder_path):# 獲取數據文件夾中的目錄(每個主題的一個目錄)dirs = os.listdir(data_folder_path)# 兩個列表分別保存所有的臉部和標簽faces = []labels = []# 瀏覽每個目錄并訪問其中的圖像for dir_name in dirs:# dir_name(str類型)即標簽label = int(dir_name)# 建立包含當前主題主題圖像的目錄路徑subject_dir_path = data_folder_path + "/" + dir_name# 獲取給定主題目錄內的圖像名稱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.1scv2.imshow("Training on image...", image)cv2.waitKey(100)# 檢測臉部face, rect = detect_face(image)# 我們忽略未檢測到的臉部if face is not None:#將臉添加到臉部列表并添加相應的標簽faces.append(face)labels.append(label)cv2.waitKey(1)cv2.destroyAllWindows()#最終返回值為人臉和標簽列表return faces, labels

    3.有了臉部信息和對應標簽后,我們就可以使用opencv自帶的識別器來進行訓練了:

    #調用prepare_training_data()函數 faces, labels = prepare_training_data("training_data") #創建LBPH識別器并開始訓練,當然也可以選擇Eigen或者Fisher識別器 face_recognizer = cv2.face.LBPHFaceRecognizer_create() face_recognizer.train(faces, np.array(labels))

    4.訓練完畢后就可以進行預測了,在這之前我們可以設定一下預測的格式,包括用矩形框框出人臉并標出其名字,當然最后別忘了建立標簽與真實姓名直接的映射表:

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

    5.現在就可以定義我們的預測函數了:

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

    6.最后使用我們test_data中的圖片進行預測并顯示最終效果:

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

    來看看識別的結果:

    這就是人臉識別最基本的流程,后續還會進一步的研究,下一篇我們將討論本次實驗的一些細節和注意事項,算是對本篇的一次挖掘和總結吧。最后附上完整代碼:

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

    伙伴們有哪些地方不清楚的可以留言哦!

    總結

    以上是生活随笔為你收集整理的opencv 人脸识别_Python学习:基于Opencv来快速实现人脸识别(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。