教你Python環(huán)境下如何用OpenCV檢測人臉!

一、文章概述

本文將要講述的是Python環(huán)境下如何用OpenCV檢測人臉,本文的主要內(nèi)容分為:

1、檢測圖片中的人臉

2、實(shí)時(shí)檢測視頻中出現(xiàn)的人臉

3、用運(yùn)設(shè)備的攝像頭實(shí)時(shí)檢測人臉

二:準(zhǔn)備工作

提前做的準(zhǔn)備:

安裝好Python3

下載安裝OpenCV庫,方法是pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com/pypi/simple

下載特征數(shù)據(jù)HAAR和LBP,這兩種數(shù)據(jù)都能實(shí)現(xiàn)對人臉特征的提取,HAAR大多是小數(shù)計(jì)算所以運(yùn)算速度較慢,LBP大多是整數(shù)計(jì)算運(yùn)行速度較快。如圖所示,本次實(shí)例用紅框中的文本,其他的文本,比如第一個(gè)haarcascade_eye.xml是眼睛識別的文本,我們下次再用。

注意:點(diǎn)擊下載HAAR和LBP的特征數(shù)據(jù)--------數(shù)據(jù)集下載

三、開始講述

1、圖片人臉檢測

(1)代碼和說明

import cv2 as cv

import numpy as np

def face_detect_demo():#人臉檢測函數(shù)

? ? gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)#把圖片變成灰度圖片,因?yàn)槿四樀奶卣餍枰诨叶葓D像中查找

? ? #以下分別是HAAR和LBP特征數(shù)據(jù),任意選擇一種即可,注意:路徑中的‘/’和‘\’是有要求的

? ? # 通過級聯(lián)檢測器 cv.CascadeClassifier,加載特征數(shù)據(jù)

? ? # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")

? ? face_detector = cv.CascadeClassifier(

? ? ? ? "D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")

? ? #在尺度空間對圖片進(jìn)行人臉檢測,第一個(gè)參數(shù)是哪個(gè)圖片,第二個(gè)參數(shù)是向上或向下的尺度變化,是原來尺度的1.02倍,第三個(gè)參數(shù)是在相鄰的幾個(gè)人臉檢測矩形框內(nèi)出現(xiàn)就認(rèn)定成人臉,這里是在相鄰的5個(gè)人臉檢測框內(nèi)出現(xiàn),如果圖片比較模糊的話建議降低一點(diǎn)

? ? faces = face_detector.detectMultiScale(gray, 1.02, 5)

? ? for x, y, w, h in faces:#繪制結(jié)果圖

? ? ? ? #rectangle參數(shù)說明,要繪制的目標(biāo)圖像,矩形的第一個(gè)頂點(diǎn),矩形對角線上的另一個(gè)頂點(diǎn),線條的顏色,線條的寬度

? ? ? ? cv.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 2)

? ? ? ? cv.imshow("result", src)#輸出結(jié)果圖

src = cv.imread("D:/pyproject/cv_renlianjiance/cvrenxiangpic/1.jpg")#圖片是JPG和png都可以

cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)#創(chuàng)建繪圖窗口

cv.namedWindow("result", cv.WINDOW_AUTOSIZE)

cv.imshow("input image", src)

face_detect_demo()

cv.waitKey(0)

cv.destroyAllWindows()#作用是能正常關(guān)閉繪圖窗口

123456789101112131415161718192021222324

(2)結(jié)果展示

2、視頻中的人臉檢測

(1)代碼和說明

import cv2 as cv

import numpy as np

def face_detect_demo(image):

? ? gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

? ? # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")

? ? face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")

? ? faces = face_detector.detectMultiScale(gray, 1.02, 5)

? ? for x, y, w, h in faces:

? ? ? ? cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)

? ? cv.imshow("result", image)

capture = cv.VideoCapture("D:/pyproject/cv_renlianjiance/video/1.mp4")

cv.namedWindow("result", cv.WINDOW_AUTOSIZE)

while (True):

? ? #按幀讀取視頻,ret,frame是獲cap.read()方法的兩個(gè)返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結(jié)尾,它的返回值就為False。frame就是每一幀的圖像,是個(gè)三維矩陣。

? ? ret, frame = capture.read()

? ? # cv.flip函數(shù)表示圖像翻轉(zhuǎn),沿y軸翻轉(zhuǎn), 0: 沿x軸翻轉(zhuǎn), <0: x、y軸同時(shí)翻轉(zhuǎn)

? ? frame = cv.flip(frame, 1)

? ? face_detect_demo(frame)

? ? #waitKey()方法本身表示等待鍵盤輸入,參數(shù)是1,表示延時(shí)1ms切換到下一幀圖像,對于視頻而言;

? ? c = cv.waitKey(10)

? ? if c == 27:#當(dāng)鍵盤按下‘ESC’退出程序

? ? ? ? break

#cv.waitKey(0)參數(shù)為0,如cv2.waitKey(0)只顯示當(dāng)前幀圖像,相當(dāng)于視頻暫停,;

cv.waitKey(0)

cv.destroyAllWindows()#作用是能正常關(guān)閉繪圖窗口

1234567891011121314151617181920212223242526272829

(2)結(jié)果展示

3、利用設(shè)備上的攝像頭進(jìn)行人臉檢測,其實(shí)和2中的代碼一樣,只是打開攝像頭,而不是讀取視頻文件

代碼和說明

import cv2 as cv

import numpy as np

def face_detect_demo(image):

? ? gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

? ? # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml")

? ? face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml")

? ? faces = face_detector.detectMultiScale(gray, 1.02, 5)

? ? for x, y, w, h in faces:

? ? ? ? cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)

? ? cv.imshow("result", image)

capture = cv.VideoCapture(0)#其中的0表示電腦中的第一個(gè)相機(jī)

cv.namedWindow("result", cv.WINDOW_AUTOSIZE)

while (True):

? ? #按幀讀取視頻,ret,frame是獲cap.read()方法的兩個(gè)返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結(jié)尾,它的返回值就為False。frame就是每一幀的圖像,是個(gè)三維矩陣。

? ? ret, frame = capture.read()

? ? # cv.flip函數(shù)表示圖像翻轉(zhuǎn),沿y軸翻轉(zhuǎn), 0: 沿x軸翻轉(zhuǎn), <0: x、y軸同時(shí)翻轉(zhuǎn)

? ? frame = cv.flip(frame, 1)

? ? face_detect_demo(frame)

? ? #waitKey()方法本身表示等待鍵盤輸入,參數(shù)是1,表示延時(shí)1ms切換到下一幀圖像,對于視頻而言;

? ? c = cv.waitKey(10)

? ? if c == 27:#當(dāng)鍵盤按下‘ESC’退出程序

? ? ? ? break

#cv.waitKey(0)參數(shù)為0,如cv2.waitKey(0)只顯示當(dāng)前幀圖像,相當(dāng)于視頻暫停,;

cv.waitKey(0)

cv.destroyAllWindows()#作用是能正常關(guān)閉繪圖窗口

1234567891011121314151617181920212223242526272829

以上就是本文所有內(nèi)容,希望能幫到大家?。?!

需要源代碼或者想了解更多內(nèi)容點(diǎn)擊這里下載

此文轉(zhuǎn)載文,著作權(quán)歸作者所有,如有侵權(quán)聯(lián)系小編刪除!

原文地址:https://blog.csdn.net/m0_45161766/article/details/107545960

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容