[Python圖像處理] 二十八.OpenCV快速實現(xiàn)人臉檢測及視頻中的人臉 丨【百變AI秀】
該系列在github所有源代碼:
https://github.com/eastmountyxz/ImageProcessing-Python
前文參考:
[Python圖像處理] 一.圖像處理基礎(chǔ)知識及OpenCV入門函數(shù)
[Python圖像處理] 二.OpenCV+Numpy庫讀取與修改像素
[Python圖像處理] 三.獲取圖像屬性、興趣ROI區(qū)域及通道處理
[Python圖像處理] 四.圖像平滑之均值濾波、方框濾波、高斯濾波及中值濾波
[Python圖像處理] 五.圖像融合、加法運(yùn)算及圖像類型轉(zhuǎn)換
[Python圖像處理] 六.圖像縮放、圖像旋轉(zhuǎn)、圖像翻轉(zhuǎn)與圖像平移
[Python圖像處理] 七.圖像閾值化處理及算法對比
[Python圖像處理] 八.圖像腐蝕與圖像膨脹
[Python圖像處理] 九.形態(tài)學(xué)之圖像開運(yùn)算、閉運(yùn)算、梯度運(yùn)算
[Python圖像處理] 十.形態(tài)學(xué)之圖像頂帽運(yùn)算和黑帽運(yùn)算
[Python圖像處理] 十一.灰度直方圖概念及OpenCV繪制直方圖
[Python圖像處理] 十二.圖像幾何變換之圖像仿射變換、圖像透視變換和圖像校正
[Python圖像處理] 十三.基于灰度三維圖的圖像頂帽運(yùn)算和黑帽運(yùn)算
[Python圖像處理] 十四.基于OpenCV和像素處理的圖像灰度化處理
[Python圖像處理] 十五.圖像的灰度線性變換
[Python圖像處理] 十六.圖像的灰度非線性變換之對數(shù)變換、伽馬變換
[Python圖像處理] 十七.圖像銳化與邊緣檢測之Roberts算子、Prewitt算子、Sobel算子和Laplacian算
[Python圖像處理] 十八.圖像銳化與邊緣檢測之Scharr算子、Canny算子和LOG算子
[Python圖像處理] 十九.圖像分割之基于K-Means聚類的區(qū)域分割
[Python圖像處理] 二十.圖像量化處理和采樣處理及局部馬賽克特效
[Python圖像處理] 二十一.圖像金字塔之圖像向下取樣和向上取樣
[Python圖像處理] 二十二.Python圖像傅里葉變換原理及實現(xiàn)
[Python圖像處理] 二十三.傅里葉變換之高通濾波和低通濾波
[Python圖像處理] 二十四.圖像特效處理之毛玻璃、浮雕和油漆特效
[Python圖像處理] 二十五.圖像特效處理之素描、懷舊、光照、流年以及濾鏡特效
[Python圖像處理] 二十六.圖像分類原理及基于KNN、樸素貝葉斯算法的圖像分類案例丨【百變AI秀】
[Python圖像處理] 二十七.OpenGL入門及繪制基本圖形(一)
[Python圖像處理] 二十八.OpenCV快速實現(xiàn)人臉檢測及視頻中的人臉 丨【百變AI秀】
文章目錄
一.OpenCV基礎(chǔ)
二.圖像單人臉檢測
三.圖像多人臉檢測
四.檢測視頻人臉
五.攝像頭人臉檢測
六.總結(jié)
一.OpenCV基礎(chǔ)
首先調(diào)用"pip install opencv-python"安裝OpenCV庫,如下圖所示,顯示“Successfully installed opencv-python-4.2.0.32”表示安裝成功。
下面代碼是讀入圖片并顯示保存。
讀入圖像
OpenCV讀圖像主要調(diào)用下面函數(shù)實現(xiàn):
img = cv2.imread(文件名,[,參數(shù)])
參數(shù)(1) cv2.IMREAD_UNCHANGED (圖像不可變)
參數(shù)(2) cv2.IMREAD_GRAYSCALE (灰度圖像)
參數(shù)(3) cv2.IMREAD_COLOR (讀入彩色圖像)
參數(shù)(4) cv2.COLOR_BGR2RGB (圖像通道BGR轉(zhuǎn)成RGB)
顯示圖像
顯示圖像調(diào)用函數(shù)如下:
cv2.imshow(窗口名, 圖像名)
窗口等待
調(diào)用函數(shù)如下:
cv2.waitKey(delay)
鍵盤綁定函數(shù),共一個參數(shù),表示等待毫秒數(shù),將等待特定的幾毫秒,看鍵盤是否有輸入,返回值為ASCII值。如果其參數(shù)為0,則表示無限期的等待鍵盤輸入;參數(shù)>0表示等待delay毫秒;參數(shù)<0表示等待鍵盤單擊。
刪除所有窗口
調(diào)用函數(shù)如下:
cv2.destroyAllWindows() 刪除所有窗口
cv2.destroyWindows() 刪除指定的窗口
寫入圖片
調(diào)用函數(shù)如下:
retval = cv2.imwrite(文件地址, 文件名)
下面代碼是讀入圖片并顯示保存。
# -*- coding:utf-8 -*- import cv2 #讀取圖片 img = cv2.imread("test.jpg") #顯示圖像 cv2.imshow("Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows() #寫入圖像 cv2.imwrite("testyxz.jpg", img)
輸出結(jié)果如下圖所示,并且在文件夾下保存了一張名為“testyxz.jpg”的圖像。
同樣,OpenCV可以實現(xiàn)各種圖像處理效果,前面的文章我們也進(jìn)行了詳細(xì)的講解。
圖像素描特效
它會將圖像的邊界都凸顯出來,通過邊緣檢測及閾值化處理能實現(xiàn)該功能。一幅圖像的內(nèi)部都具有相似性,而在圖像邊界處具有明顯的差異,邊緣檢測利用數(shù)學(xué)中的求導(dǎo)來擴(kuò)大這種變化。但是求導(dǎo)過程中會增大圖像的噪聲,所以邊緣檢測之前引入了高斯濾波降噪處理。本文的圖像素描特效主要經(jīng)過以下幾個步驟:
調(diào)用cv2.cvtColor()函數(shù)將彩色圖像灰度化處理;
通過cv2.GaussianBlur()函數(shù)實現(xiàn)高斯濾波降噪;
邊緣檢測采用Canny算子實現(xiàn);
最后通過cv2.threshold()反二進(jìn)制閾值化處理實現(xiàn)素描特效。
其運(yùn)行代碼如下所示。
#coding:utf-8 import cv2 import numpy as np #讀取原始圖像 img = cv2.imread('yxz.png') #圖像灰度處理 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #高斯濾波降噪 gaussian = cv2.GaussianBlur(gray, (5,5), 0) #Canny算子 canny = cv2.Canny(gaussian, 50, 150) #閾值化處理 ret, result = cv2.threshold(canny, 100, 255, cv2.THRESH_BINARY_INV) #顯示圖像 cv2.imshow('src', img) cv2.imshow('gray', gray) cv2.imshow('result', result) cv2.waitKey() cv2.destroyAllWindows()
最終輸出結(jié)果如下圖所示,它將彩色圖像灰度素描處理。
二.圖像單人臉檢測
人臉識別的常見步驟如下,如果想要將人臉準(zhǔn)確地找出來,需要通過建立人臉模型,獲取準(zhǔn)確區(qū)分人臉的分類器,這里我們使用網(wǎng)上公開的擴(kuò)展包或已經(jīng)訓(xùn)練好的分類器。
第一步,下載人臉識別算法,這里使用OpenCV發(fā)布在github上的代碼。
-:
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
我們將“haarcascade_frontalface_default.xml”文件下載至本地,后續(xù)調(diào)用它輔助我們進(jìn)行人臉識別。
第二步,調(diào)用cv2.CascadeClassifier()和detectMultiScale()函數(shù),根據(jù)人臉特征進(jìn)行識別。
CascadeClassifier:是OpenCV中人臉檢測的一個級聯(lián)分類器,既可以使用Haar,也可以使用LBP特征。以Haar特征分類器為基礎(chǔ)的對象檢測技術(shù)是一種非常有效的技術(shù)。它是基于機(jī)器學(xué)習(xí)且使用大量的正負(fù)樣本訓(xùn)練得到分類器。
Haar-like矩形特征:是用于物體檢測的數(shù)字圖像特征。這類矩形特征模板由兩個或多個全等的黑白矩形相鄰組合而成,而矩形特征值是白色矩形的灰度值的和減去黑色矩形的灰度值的和,矩形特征對一些簡單的圖形結(jié)構(gòu),如線段、邊緣比較敏感。如果把這樣的矩形放在一個非人臉區(qū)域,那么計算出的特征值應(yīng)該和人臉特征值不一樣,所以這些矩形就是為了把人臉特征量化,以區(qū)分人臉和非人臉。
LBP:是一種特征提取方式,能提取出圖像的局部的紋理特征,最開始的LBP算子是在3X3窗口中,取中心像素的像素值為閥值,與其周圍八個像素點的像素值比較,若像素點的像素值大于閥值,則此像素點被標(biāo)記為1,否則標(biāo)記為0。這樣就能得到一個八位二進(jìn)制的碼,轉(zhuǎn)換為十進(jìn)制即LBP碼,于是得到了這個窗口的LBP值,用這個值來反映這個窗口內(nèi)的紋理信息。LBPH是在原始LBP上的一個改進(jìn),在opencv支持下我們可以直接調(diào)用函數(shù)直接創(chuàng)建一個LBPH人臉識別的模型。比如:cv2.face.LBPHFaceRecognizer_create()。
detectMultiScale:檢測人臉?biāo)惴ǎ鋮?shù):
– image表示要檢測的輸入圖像
– objects表示檢測到的人臉目標(biāo)序列
– scaleFactor表示每次圖像尺寸減小的比例
– minNeighbors表示每一個目標(biāo)至少要被檢測到3次才算是真的目標(biāo),因為周圍的像素和不同的窗口大小都可以檢測到人臉
– minSize表示目標(biāo)的最小尺寸
– minSize表示目標(biāo)的最大尺寸
第三步,繪制矩形或圓形檢測人臉,并將人臉識別的最終圖像顯示出來。
完整代碼如下所示:
#coding:utf-8 import cv2 # 讀取原始圖像 img = cv2.imread('yxz.png') # 調(diào)用熟悉的人臉分類器 檢測特征類型 # 人臉 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xm # 微笑 - haarcascade_smile.xml face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 檢查人臉 按照1.1倍放到 周圍最小像素為5 face_zone = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5) print ('識別人臉的信息:',face_zone) # 繪制矩形和圓形檢測人臉 for x, y, w, h in face_zone: # 繪制矩形人臉區(qū)域 thickness表示線的粗細(xì) cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,0,255], thickness=2) # 繪制圓形人臉區(qū)域 radius表示半徑 cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2) # 設(shè)置圖片可以手動調(diào)節(jié)大小 cv2.namedWindow("Easmount-CSDN", 0) # 顯示圖片 cv2.imshow("Easmount-CSDN", img) # 等待顯示 設(shè)置任意鍵退出程序 cv2.waitKey(0) cv2.destroyAllWindows()
注意,此時的算法只能檢測正臉,比如下圖就無法檢測。
三.圖像多人臉檢測
檢測圖像多張人臉,其方法和前面非常類似,基本流程如下:
將圖像轉(zhuǎn)換為灰度圖像
調(diào)用cv2.CascadeClassifier()和detectMultiScale()函數(shù),根據(jù)人臉特征進(jìn)行識別
繪制矩形或圓形檢測人臉,并將人臉識別的最終圖像顯示出來
完整代碼如下圖所示:
#coding:utf-8 import cv2 # 讀取原始圖像 img = cv2.imread('test01.jpg') # 調(diào)用熟悉的人臉分類器 識別特征類型 # 人臉 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xm # 微笑 - haarcascade_smile.xml face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 灰度處理 gray = cv2.cvtColor(img, code=cv2.COLOR_BGR2GRAY) # 檢查人臉 按照1.1倍放到 周圍最小像素為5 face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.1, minNeighbors = 4) # maxSize = (55,55) print ('識別人臉的信息:\n',face_zone) # 繪制矩形和圓形檢測人臉 for x, y, w, h in face_zone: # 繪制矩形人臉區(qū)域 cv2.rectangle(img, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2) # 繪制圓形人臉區(qū)域 radius表示半徑 cv2.circle(img, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 設(shè)置圖片可以手動調(diào)節(jié)大小 cv2.namedWindow("Easmount-CSDN", 0) # 顯示圖片 cv2.imshow("Easmount-CSDN", img) # 等待顯示 設(shè)置任意鍵退出程序 cv2.waitKey(0) cv2.destroyAllWindows()
如下圖所示,將兩人的臉龐識別出來。注意,該算法會根據(jù)人臉的不同尺寸,繪制不同人臉的矩形或圓形框出。
識別人臉的信息: [[479 281 154 154] [314 359 129 129]]
再舉一個北影畢業(yè)照的示例,可以看到人臉被成功的識別。
識別人臉的信息: [[166 38 26 26] [366 80 30 30] [273 83 30 30] [117 40 29 29] [ 71 44 28 28] [210 127 30 30] [376 45 27 27] [ 39 89 29 29] [285 126 30 30] [329 128 29 29] [196 48 30 30] [366 129 32 32] [306 82 31 31] [135 123 32 32] [134 76 29 29] [ 92 102 32 32] [341 22 26 26] [140 25 28 28] [305 30 30 30] [244 35 27 27] [250 109 31 31] [174 111 30 30] [336 75 29 29]]
同樣,任何算法都不會100%識別準(zhǔn)確,由于噪聲、誤差、算法、訓(xùn)練集等影響,某些時候也會出現(xiàn)錯誤識別。一方面OpenCV無法識別側(cè)臉,另一方面某些花被識別成人臉。
四.檢測視頻人臉
這里需要調(diào)用cv2.VideoCapture()函數(shù)導(dǎo)入視頻,然后讀取視頻中的數(shù)據(jù),最后調(diào)用之前的算法識別人臉。核心代碼如下:
讀取視頻數(shù)據(jù)
cap = cv2.VideoCapture(‘shipin.mp4’) #導(dǎo)入視頻
flag, frame = cap.read()
flag:返回值為True和False,True和圖片一起返回,當(dāng)讀完視頻后返回False
frame:接受返回來的圖片
人臉像素檢測識別
face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3)
scaleFactor:檢測像素點擴(kuò)散的面積
minNeighbors:像素點鄰近值
設(shè)置視頻展示頻度
為了讓視頻的展示速度和原視頻一致,我們需要調(diào)用 “cap.get(propId = cv2.CAP_PROP_FPS)” 函數(shù)將其設(shè)置為25,即每秒25幀。
完整代碼如下:
#coding:utf-8 import cv2 import numpy as np # 加載視頻 cap = cv2.VideoCapture('shipin01.mp4') # 調(diào)用熟悉的人臉分類器 識別特征類型 # 人臉 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xm # 微笑 - haarcascade_smile.xml face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') while True: # 讀取視頻片段 flag, frame = cap.read() if flag == False: break # 灰度處理 gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY) # 檢查人臉 按照1.1倍放到 周圍最小像素為5 face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.1, minNeighbors = 4) # 繪制矩形和圓形檢測人臉 for x, y, w, h in face_zone: cv2.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2) cv2.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 顯示圖片 cv2.imshow('video', frame) # 設(shè)置退出鍵和展示頻率 if ord('q') == cv2.waitKey(40): break # 釋放資源 cv2.destroyAllWindows() cap.release()
女神跳舞輸出視頻如下圖所示,能夠?qū)崟r獲取人臉并顯示。但是當(dāng)人物跳舞運(yùn)動時,由于抖動會導(dǎo)致識別的人臉不準(zhǔn)確,這也是更多算法要進(jìn)行優(yōu)化的原因。本文當(dāng)前僅分享基礎(chǔ)知識,后續(xù)隨著自己深入研究,可能會分享更深更好的文章。
五.攝像頭人臉檢測
識別電腦攝像頭的流程和識別視頻中的是一樣的,只是加載源的方式不一樣。當(dāng)VideoCapture(0)時,自動調(diào)用攝像頭捕捉視頻。
#coding:utf-8 import cv2 # 識別電腦攝像頭并打開 cap = cv2.VideoCapture(0) # 調(diào)用熟悉的人臉分類器 識別特征類型 # 人臉 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xm # 微笑 - haarcascade_smile.xml face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') while True: # 讀取視頻片段 flag, frame = cap.read() if flag == False: break # 灰度處理 gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY) # 檢查人臉 按照1.1倍放到 周圍最小像素為5 face_zone = face_detect.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 5) # 繪制矩形和圓形檢測人臉 for x, y, w, h in face_zone: cv2.rectangle(frame, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2) cv2.circle(frame, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 顯示圖片 cv2.imshow('video', frame) # 設(shè)置退出鍵和展示頻率 if ord('q') == cv2.waitKey(40): break # 釋放資源 cv2.destroyAllWindows() cap.release()
輸出結(jié)果如下圖所示,同樣需要注意識別正臉和靜止?fàn)顟B(tài)效果更好。
六.總結(jié)
這篇文章參考了楊友學(xué)生的分享,作為老師,最開心的事是看到學(xué)生不斷成長,分享這么好的文章、撰寫高質(zhì)量的論文、找到編程相關(guān)的工作。也希望更多學(xué)生能從我的文章、故事、課堂中學(xué)到有用的知識或一些感受,我會繼續(xù)努力,爭取早日博士畢業(yè),回貴州那篇土地繼續(xù)教書育人。一起加油~
感恩能與大家在華為云遇見!
希望能與大家一起在華為云社區(qū)共同成長,原文地址:https://blog.csdn.net/Eastmount/article/details/104463173
【百變AI秀】有獎?wù)魑幕馃徇M(jìn)行中:https://bbs.huaweicloud.com/blogs/29670
(By:娜璋之家 Eastmount 2021-08-28 夜于貴陽)
參考文獻(xiàn):
[1]?圖像處理之opencv識別圖片和視頻中人臉 - 阿優(yōu)樂揚(yáng)
[2]?https://github.com/opencv/opencv/blob/master/data/haarcascades
[3]?cv2級聯(lián)分類器CascadeClassifier - cchangcs
[4]?OpenCV實踐之路——人臉檢測(C++/Python) - 冰不語
[5]?10分鐘手把手教你運(yùn)用Python實現(xiàn)簡單的人臉識別 - 短短的路走走停停
OpenCV Python 圖像處理
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。