溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能

發(fā)布時(shí)間:2021-09-07 16:57:13 來(lái)源:億速云 閱讀:198 作者:chen 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能”吧!

目錄
  • 一、環(huán)境

  • 二、使用Haar級(jí)聯(lián)進(jìn)行人臉檢測(cè)

  • 三、Haar級(jí)聯(lián)結(jié)合攝像頭

  • 四、使用SSD的人臉檢測(cè)

  • 五、 SSD結(jié)合攝像頭人臉檢測(cè)


一、環(huán)境

pip install opencv-python

python3.9

pycharm2020

人狠話不多,直接上代碼,注釋在代碼里面,不說(shuō)廢話。

二、使用Haar級(jí)聯(lián)進(jìn)行人臉檢測(cè)

測(cè)試案例:

如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能

代碼:(記得自己到下載地址下載對(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)

效果:

如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能

效果可以看出這個(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()

效果:

如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能

四、使用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)

效果:

如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能

我們可以看到現(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()

效果:

如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能

可以發(fā)現(xiàn)SSD效果特別好!

到此,相信大家對(duì)“如何利用opencv實(shí)現(xiàn)人臉識(shí)別功能”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI