手把手教你利用opencv實(shí)現(xiàn)人臉識(shí)別功能(附源碼+文檔)
一、環(huán)境
pip install opencv-python
python3.9
pycharm2020
人狠話不多,直接上代碼,注釋在代碼里面,不說廢話。
二、使用Haar級(jí)聯(lián)進(jìn)行人臉檢測(cè)
測(cè)試案例:

代碼:(記得自己到下載地址下載對(duì)應(yīng)的xml)
# coding=gbk
"""
作者:川川
@時(shí)間 : 2021/9/5 16:38
https://github.com/opencv/opencv/tree/master/data/haarcascades
"""
import cv2
# 待檢測(cè)的圖片路徑
imagepath="2.jpg"
image = cv2.imread(imagepath)#讀取圖片
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#圖像轉(zhuǎn)換為灰度圖:
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')#加載使用人臉識(shí)別器
faces = face_cascade.detectMultiScale(gray)#檢測(cè)圖像中的所有面孔
#為每個(gè)人臉繪制一個(gè)藍(lán)色矩形
for x, y, width, height in faces:
# 這里的color是 藍(lán) 黃 紅,與rgb相反,thickness設(shè)置寬度
cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
# 最后,讓我們保存新圖像
cv2.imwrite("beauty_detected.jpg", image)
效果:

效果可以看出這個(gè)效果并不是很好。
三、Haar級(jí)聯(lián)結(jié)合攝像頭
代碼:(還是用的前面得xml)
# coding=gbk
"""
攝像頭人臉識(shí)別
作者:川川
@時(shí)間 : 2021/9/5 17:15
Haar級(jí)聯(lián)結(jié)合攝像頭
"""
import cv2
#創(chuàng)建新的cam對(duì)象
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#初始化人臉識(shí)別器(默認(rèn)的人臉haar級(jí)聯(lián))
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
while True:
# 從攝像頭讀取圖像
_, image = cap.read()
# 轉(zhuǎn)換為灰度
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 檢測(cè)圖像中的所有人臉
faces = face_cascade.detectMultiScale(image_gray, 1.3, 5)
# 為每個(gè)人臉繪制一個(gè)藍(lán)色矩形
for x, y, width, height in faces:
cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
cv2.imshow("image", image)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
效果:

四、使用SSD的人臉檢測(cè)
代碼:
# coding=gbk
"""
圖片人臉識(shí)別
作者:川川
@時(shí)間 : 2021/9/5 17:22
"""
import cv2
import numpy as np
# 下載鏈接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
prototxt_path = r"./deploy.prototxt.txt"
# 下載鏈接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel
model_path =r"./res10_300x300_ssd_iter_140000_fp16.caffemodel"
model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
image = cv2.imread("2.jpg")
h, w = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))
model.setInput(blob)
output = np.squeeze(model.forward())
font_scale = 1.0
for i in range(0, output.shape[0]):
confidence = output[i, 2]
if confidence > 0.5:
box = output[i, 3:7] * np.array([w, h, w, h])
start_x, start_y, end_x, end_y = box.astype(np.int)
cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.imwrite("beauty_detected.jpg", image)
效果:

我們可以看到現(xiàn)在的識(shí)別效果非常好了。
五、 SSD結(jié)合攝像頭人臉檢測(cè)
代碼:
# coding=gbk
"""
作者:川川
@時(shí)間 : 2021/9/5 17:26
SSD結(jié)合攝像頭的人臉檢測(cè)
"""
import cv2
import numpy as np
prototxt_path = "deploy.prototxt.txt"
model_path = "res10_300x300_ssd_iter_140000_fp16.caffemodel"
model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
cap = cv2.VideoCapture(0)
while True:
_, image = cap.read()
h, w = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
model.setInput(blob)
output = np.squeeze(model.forward())
font_scale = 1.0
for i in range(0, output.shape[0]):
confidence = output[i, 2]
if confidence > 0.5:
box = output[i, 3:7] * np.array([w, h, w, h])
start_x, start_y, end_x, end_y = box.astype(np.int)
cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
cv2.imshow("image", image)
if cv2.waitKey(1) == ord("q"):
break
cv2.destroyAllWindows()
cap.release()
效果:

可以發(fā)現(xiàn)SSD效果特別好!
六、結(jié)語
如果你想更深了解這些原理,去讀一下opencv文檔吧,中文官方文檔如下:
https://woshicver.com/
在很多人調(diào)用xm會(huì)遇到一些坑,我在這里說一下,讀取xml的時(shí)候用相對(duì)路徑./這種,參考我的,建議不要路徑中出現(xiàn)中文,其它沒啥了。
到此這篇關(guān)于手把手教你利用opencv實(shí)現(xiàn)人臉識(shí)別功能的文章就介紹到這了,更多相關(guān)opencv實(shí)現(xiàn)人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot集成opencv實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)步驟
- java+opencv實(shí)現(xiàn)人臉識(shí)別功能
- python opencv人臉識(shí)別考勤系統(tǒng)的完整源碼
- python基于opencv實(shí)現(xiàn)人臉識(shí)別
- python實(shí)現(xiàn)圖片,視頻人臉識(shí)別(opencv版)
- PyQt5+Caffe+Opencv搭建人臉識(shí)別登錄界面
- OpenCV + MFC實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別
- opencv實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別
- Java OpenCV4.0.0實(shí)現(xiàn)實(shí)時(shí)人臉識(shí)別
- 基于opencv和pillow實(shí)現(xiàn)人臉識(shí)別系統(tǒng)(附demo)
相關(guān)文章
Python代碼統(tǒng)計(jì)耗時(shí)的方法詳解
在現(xiàn)代軟件開發(fā)中,性能優(yōu)化是一個(gè)至關(guān)重要的環(huán)節(jié),無論是開發(fā)大型系統(tǒng)還是小型工具,開發(fā)者都需要對(duì)代碼的執(zhí)行時(shí)間進(jìn)行精確測(cè)量,以便找出瓶頸并優(yōu)化性能,本文給大家介紹了Python代碼統(tǒng)計(jì)耗時(shí)的方法,需要的朋友可以參考下2025-02-02
python GUI庫(kù)圖形界面開發(fā)之PyQt5下拉列表框控件QComboBox詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)之PyQt5下拉列表框控件QComboBox詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
Python在cmd上打印彩色文字實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Python在cmd上打印彩色文字實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python 字符串操作實(shí)現(xiàn)代碼(截取/替換/查找/分割)
這篇文章主要介紹了Python 字符串截取/替換/查找/分割等實(shí)現(xiàn)方法,需要的朋友可以參考下2013-06-06
關(guān)于python實(shí)現(xiàn)json/字典數(shù)據(jù)中所有key路徑拼接組合問題
這篇文章主要介紹了關(guān)于python實(shí)現(xiàn)json/字典數(shù)據(jù)中所有key路徑拼接組合問題,文中有詳細(xì)的代碼說明,需要的朋友可以參考下2023-04-04
pycharm Tab鍵設(shè)置成4個(gè)空格的操作
這篇文章主要介紹了pycharm Tab鍵設(shè)置成4個(gè)空格的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
通過Python的jieba庫(kù)對(duì)文本進(jìn)行分詞
Python的jieba庫(kù)是一個(gè)中文分詞工具,它可以將一段中文文本分割成一個(gè)一個(gè)的詞語,方便后續(xù)的自然語言處理任務(wù),如文本分類、情感分析等,本文給大家介紹如何通過Python的jieba庫(kù)對(duì)文本進(jìn)行分詞,文中詳細(xì)的代碼示例,需要的朋友可以參考下2023-05-05

