OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)
OpenCV與圖像處理學習十七——OpenCV人臉檢測(含代碼)
- 一、人臉識別概要
- 1.1 人臉檢測
- 1.2 人臉對齊(Face Alignment)
- 1.3 人臉特征提取(Face Feature Extraction)
- 1.4 人臉識別(Face Recognition)
- 二、人臉檢測(不是識別)的代碼
- 2.1 cv2.CascadeClassifier
- 2.2 dlib庫
一、人臉識別概要
一般而言,一個完整的人臉識別系統包含4個主要組成部分,即人臉檢測、人臉對齊(將側臉或歪臉變成正面臉)、人臉特征提取以及人臉識別。
四部分流水線操作:
- 人臉檢測在圖像中找到人臉的位置;
- 人臉配準在人臉上找到眼睛、鼻子、嘴巴等面部器官的位置;
- 通過人臉特征提取將人臉圖像信息抽象為字符串信息;
- 人臉識別將目標人臉圖像與既有人臉比對計算相似度,確認人臉對應身份。
1.1 人臉檢測
人臉檢測算法的輸入是一張圖片,輸出是人臉框坐標序列。一般情況下,輸出的人臉坐標框為一個正朝上的正方形,但也有一些人臉檢測技術輸出是正朝上的矩形,或者是帶旋轉方向的矩形。
1.2 人臉對齊(Face Alignment)
根據人臉圖像,自動定位出人臉五官關鍵點坐標的一項技術。
人臉對齊算法的輸入是“一張人臉圖片”加“人臉坐標框”,輸出五官關鍵點的坐標序列。五官關鍵點的數量是預先設定好的一個固定數值,可以根據不同的語義來定義(常見的有5點、68點等)。
對人臉圖像進行特征點定位,將得到的特征點利用仿射變換進行人臉矯正,若不矯正,非正面人臉進行識別的準確率不高。
1.3 人臉特征提取(Face Feature Extraction)
將一張人臉圖像轉化為一串固定長度的數值的過程。
具有表征某個人臉特點能力的數值串被稱為“人臉特征(Face Feature)”
1.4 人臉識別(Face Recognition)
識別出輸入人臉圖對應身份的算法。
輸入一個人臉特征,通過和注冊在庫中N個身份對應的特征進行逐個比對,找出 “一個” 與輸入特征相似度最高的特征。將這個最高相似度和預設的閾值進行比較,如果大于閾值,則返回該特征對應的身份,否則返回 “不在庫中” 。
二、人臉檢測(不是識別)的代碼
2.1 cv2.CascadeClassifier
import cv2# 讀入圖像 img = cv2.imread("image/3.png")# 加載人臉特征,該文件在 python安裝目錄\Lib\site-packages\cv2\data 下 # 注意xml文件的路徑一定要對 face_cascade = cv2.CascadeClassifier(r'image/haarcascade_frontalface_default.xml') # 將讀取的圖像轉為COLOR_BGR2GRAY,減少計算強度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 檢測出的人臉個數 faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 4, minSize = (5, 5))print("Face : {0}".format(len(faces))) print(faces) # 用矩形圈出人臉的位置 for(x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.namedWindow("Faces") cv2.imshow("Faces", img) cv2.waitKey(0) cv2.destroyAllWindows()效果如下所示:
2.2 dlib庫
ps:dlib庫的安裝可以自行百度。
dlib庫是通過68特征點來識別人臉的:
# -*- coding:utf-8 -*- import cv2 import dlib import numpy as nppredictor_model = 'image/shape_predictor_68_face_landmarks/shape_predictor_68_face_landmarks.dat' detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor(predictor_model)# cv2讀取圖像 test_film_path = "image/3.png" img = cv2.imread(test_film_path) # 取灰度 img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 人臉數rects rects = detector(img_gray, 0) print(rects[0]) for i in range(len(rects)):landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])print(landmarks, type(landmarks))for idx, point in enumerate(landmarks):# 68點的坐標pos = (point[0, 0], point[0, 1])#print(idx+1, pos)# 利用cv2.circle給每個特征點畫一個圈,共68個cv2.circle(img, pos, 3, color=(0, 255, 0))# 利用cv2.putText輸出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(idx+1), pos, font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)# cv2.imwrite("result.png", img) cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows()效果如下所示:
68點坐標保存在一個np.martrix里:
總結
以上是生活随笔為你收集整理的OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python刷题+leetcode(第二
- 下一篇: 深度学习-KNN,K近邻算法简介