[Python圖像處理] 二十八.OpenCV快速實現(xiàn)人臉檢測及視頻中的人臉 丨【百變AI秀】

      網(wǎng)友投稿 1385 2022-05-29

      該系列在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ù)如下:

      [Python圖像處理] 二十八.OpenCV快速實現(xiàn)人臉檢測及視頻中的人臉 丨【百變AI秀】

      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)容。

      上一篇:基于華為云輕松搭建屬于自己的網(wǎng)站 (Linux,Apache,MySQL,PHP)
      下一篇:操作系統(tǒng)——進(jìn)程和線程
      相關(guān)文章
      久久亚洲日韩看片无码| 国产亚洲人成网站在线观看| 亚洲午夜爱爱香蕉片| 色偷偷亚洲男人天堂| 99亚偷拍自图区亚洲| 亚洲男人的天堂久久精品| 亚洲国产精品成人精品软件| 亚洲最新中文字幕| 亚洲欧洲日产v特级毛片| 亚洲成a人片在线观看中文app| 97se亚洲综合在线| 亚洲精品成人图区| 亚洲电影在线播放| 亚洲午夜电影在线观看高清| 久久精品国产亚洲av麻豆图片| 亚洲午夜久久久精品电影院| 亚洲AV一二三区成人影片| 亚洲国产成人99精品激情在线| 亚洲最大成人网色香蕉| 亚洲videos| 亚洲一区二区三区成人网站| 亚洲高清一区二区三区电影| 色窝窝亚洲av网| 亚洲一区日韩高清中文字幕亚洲| 久久激情亚洲精品无码?V | 亚洲桃色AV无码| 亚洲色欲色欲www在线丝| 亚洲va无码手机在线电影| 久久久久亚洲AV成人无码| 亚洲精品自产拍在线观看动漫| 日韩亚洲AV无码一区二区不卡| 久久精品蜜芽亚洲国产AV| 亚洲婷婷天堂在线综合| 色老板亚洲视频免在线观| 亚洲av无码有乱码在线观看| 亚洲国产精品国产自在在线| 最新国产AV无码专区亚洲| 久久久久无码精品亚洲日韩| 亚洲欧洲自拍拍偷午夜色| 亚洲色偷偷色噜噜狠狠99| 国产亚洲Av综合人人澡精品|