OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)
OpenCV與圖像處理學(xué)習(xí)十七——OpenCV人臉檢測(含代碼)
- 一、人臉識(shí)別概要
- 1.1 人臉檢測
- 1.2 人臉對(duì)齊(Face Alignment)
- 1.3 人臉特征提取(Face Feature Extraction)
- 1.4 人臉識(shí)別(Face Recognition)
- 二、人臉檢測(不是識(shí)別)的代碼
- 2.1 cv2.CascadeClassifier
- 2.2 dlib庫
一、人臉識(shí)別概要
一般而言,一個(gè)完整的人臉識(shí)別系統(tǒng)包含4個(gè)主要組成部分,即人臉檢測、人臉對(duì)齊(將側(cè)臉或歪臉變成正面臉)、人臉特征提取以及人臉識(shí)別。
四部分流水線操作:
- 人臉檢測在圖像中找到人臉的位置;
- 人臉配準(zhǔn)在人臉上找到眼睛、鼻子、嘴巴等面部器官的位置;
- 通過人臉特征提取將人臉圖像信息抽象為字符串信息;
- 人臉識(shí)別將目標(biāo)人臉圖像與既有人臉比對(duì)計(jì)算相似度,確認(rèn)人臉對(duì)應(yīng)身份。
1.1 人臉檢測
人臉檢測算法的輸入是一張圖片,輸出是人臉框坐標(biāo)序列。一般情況下,輸出的人臉坐標(biāo)框?yàn)橐粋€(gè)正朝上的正方形,但也有一些人臉檢測技術(shù)輸出是正朝上的矩形,或者是帶旋轉(zhuǎn)方向的矩形。
1.2 人臉對(duì)齊(Face Alignment)
根據(jù)人臉圖像,自動(dòng)定位出人臉五官關(guān)鍵點(diǎn)坐標(biāo)的一項(xiàng)技術(shù)。
人臉對(duì)齊算法的輸入是“一張人臉圖片”加“人臉坐標(biāo)框”,輸出五官關(guān)鍵點(diǎn)的坐標(biāo)序列。五官關(guān)鍵點(diǎn)的數(shù)量是預(yù)先設(shè)定好的一個(gè)固定數(shù)值,可以根據(jù)不同的語義來定義(常見的有5點(diǎn)、68點(diǎn)等)。
對(duì)人臉圖像進(jìn)行特征點(diǎn)定位,將得到的特征點(diǎn)利用仿射變換進(jìn)行人臉矯正,若不矯正,非正面人臉進(jìn)行識(shí)別的準(zhǔn)確率不高。
1.3 人臉特征提取(Face Feature Extraction)
將一張人臉圖像轉(zhuǎn)化為一串固定長度的數(shù)值的過程。
具有表征某個(gè)人臉特點(diǎn)能力的數(shù)值串被稱為“人臉特征(Face Feature)”
1.4 人臉識(shí)別(Face Recognition)
識(shí)別出輸入人臉圖對(duì)應(yīng)身份的算法。
輸入一個(gè)人臉特征,通過和注冊(cè)在庫中N個(gè)身份對(duì)應(yīng)的特征進(jìn)行逐個(gè)比對(duì),找出 “一個(gè)” 與輸入特征相似度最高的特征。將這個(gè)最高相似度和預(yù)設(shè)的閾值進(jìn)行比較,如果大于閾值,則返回該特征對(duì)應(yīng)的身份,否則返回 “不在庫中” 。
二、人臉檢測(不是識(shí)別)的代碼
2.1 cv2.CascadeClassifier
import cv2# 讀入圖像 img = cv2.imread("image/3.png")# 加載人臉特征,該文件在 python安裝目錄\Lib\site-packages\cv2\data 下 # 注意xml文件的路徑一定要對(duì) face_cascade = cv2.CascadeClassifier(r'image/haarcascade_frontalface_default.xml') # 將讀取的圖像轉(zhuǎn)為COLOR_BGR2GRAY,減少計(jì)算強(qiáng)度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 檢測出的人臉個(gè)數(shù) 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特征點(diǎn)來識(shí)別人臉的:
# -*- 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)# 人臉數(shù)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點(diǎn)的坐標(biāo)pos = (point[0, 0], point[0, 1])#print(idx+1, pos)# 利用cv2.circle給每個(gè)特征點(diǎn)畫一個(gè)圈,共68個(gè)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點(diǎn)坐標(biāo)保存在一個(gè)np.martrix里:
總結(jié)
以上是生活随笔為你收集整理的OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python刷题+leetcode(第二
- 下一篇: 深度学习-KNN,K近邻算法简介