如何在python中利用Opencv實(shí)現(xiàn)一個人臉識別功能?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比民和網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式民和網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋民和地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言,其最初的設(shè)計(jì)是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨(dú)立的項(xiàng)目和大型項(xiàng)目。
1、視頻流中進(jìn)行人臉識別
# -*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(window_name) # 視頻來源,可以來自一段已存好的視頻,也可以直接來自USB攝像頭 cap = cv2.VideoCapture(camera_idx) # 告訴OpenCV使用人臉識別分類器 classfier = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml") # 識別出人臉后要畫的邊框的顏色,RGB格式 color = (0, 255, 0) count=0 while cap.isOpened(): ok, frame = cap.read() # 讀取一幀數(shù)據(jù) if not ok: break # 將當(dāng)前幀轉(zhuǎn)換成灰度圖像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點(diǎn)數(shù) faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) if len(faceRects) > 0: # 大于0則檢測到人臉 count=count+1 return count if __name__ == '__main__': result=CatchUsbVideo("識別人臉區(qū)域", '2222.mp4') if result>0: print('視頻中有人?。?#39;) else: print('視頻中無人??!')
2、通過圖片識別人臉
#-*-coding:utf8-*-# import os import cv2 from PIL import Image,ImageDraw from datetime import datetime import time #detectFaces()返回圖像中所有人臉的矩形坐標(biāo)(矩形左上、右下頂點(diǎn)) #使用haar特征的級聯(lián)分類器haarcascade_frontalface_default.xml,在haarcascades目錄下還有其他的訓(xùn)練好的xml文件可供選擇。 #注:haarcascades目錄下訓(xùn)練好的分類器必須以灰度圖作為輸入。 def detectFaces(image_name): img = cv2.imread(image_name) face_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml") if img.ndim == 3: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray = img #if語句:如果img維度為3,說明不是灰度圖,先轉(zhuǎn)化為灰度圖gray,如果不為3,也就是2,原圖就是灰度圖 faces = face_cascade.detectMultiScale(gray, 1.2, 5)#1.3和5是特征的最小、大檢測窗口,它改變檢測結(jié)果也會改變 result = [] for (x,y,width,height) in faces: result.append((x,y,x+width,y+height)) return result #保存人臉圖 def saveFaces(image_name): faces = detectFaces(image_name) if faces: #將人臉保存在save_dir目錄下。 #Image模塊:Image.open獲取圖像句柄,crop剪切圖像(剪切的區(qū)域就是detectFaces返回的坐標(biāo)),save保存。 save_dir = image_name.split('.')[0]+"_faces" os.mkdir(save_dir) count = 0 for (x1,y1,x2,y2) in faces: file_name = os.path.join(save_dir,str(count)+".jpg") Image.open(image_name).crop((x1,y1,x2,y2)).save(file_name) count+=1 #在原圖像上畫矩形,框出所有人臉。 #調(diào)用Image模塊的draw方法,Image.open獲取圖像句柄,ImageDraw.Draw獲取該圖像的draw實(shí)例,然后調(diào)用該draw實(shí)例的rectangle方法畫矩形(矩形的坐標(biāo)即 #detectFaces返回的坐標(biāo)),outline是矩形線條顏色(B,G,R)。 #注:原始圖像如果是灰度圖,則去掉outline,因?yàn)榛叶葓D沒有RGB可言。drawEyes、detectSmiles也一樣。 def drawFaces(image_name): faces = detectFaces(image_name) if faces: img = Image.open(image_name) draw_instance = ImageDraw.Draw(img) for (x1,y1,x2,y2) in faces: draw_instance.rectangle((x1,y1,x2,y2), outline=(255, 0,0)) img.save('drawfaces_'+image_name) #檢測眼睛,返回坐標(biāo) #由于眼睛在人臉上,我們往往是先檢測出人臉,再細(xì)入地檢測眼睛。故detectEyes可在detectFaces基礎(chǔ)上來進(jìn)行,代碼中需要注意“相對坐標(biāo)”。 #當(dāng)然也可以在整張圖片上直接使用分類器,這種方法代碼跟detectFaces一樣,這里不多說。 def detectEyes(image_name): eye_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml') faces = detectFaces(image_name) img = cv2.imread(image_name) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) result = [] for (x1,y1,x2,y2) in faces: roi_gray = gray[y1:y2, x1:x2] eyes = eye_cascade.detectMultiScale(roi_gray,1.3,2) for (ex,ey,ew,eh) in eyes: result.append((x1+ex,y1+ey,x1+ex+ew,y1+ey+eh)) return result #在原圖像上框出眼睛. def drawEyes(image_name): eyes = detectEyes(image_name) if eyes: img = Image.open(image_name) draw_instance = ImageDraw.Draw(img) for (x1,y1,x2,y2) in eyes: draw_instance.rectangle((x1,y1,x2,y2), outline=(0, 0,255)) img.save('draweyes_'+image_name) #檢測笑臉 def detectSmiles(image_name): img = cv2.imread(image_name) smiles_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_smile.xml") if img.ndim == 3: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray = img #if語句:如果img維度為3,說明不是灰度圖,先轉(zhuǎn)化為灰度圖gray,如果不為3,也就是2,原圖就是灰度圖 smiles = smiles_cascade.detectMultiScale(gray,4,5) result = [] for (x,y,width,height) in smiles: result.append((x,y,x+width,y+height)) return result #在原圖像上框出笑臉 def drawSmiles(image_name): smiles = detectSmiles(image_name) if smiles: img = Image.open(image_name) draw_instance = ImageDraw.Draw(img) for (x1,y1,x2,y2) in smiles: draw_instance.rectangle((x1,y1,x2,y2), outline=(100, 100,0)) img.save('drawsmiles_'+image_name) if __name__ == '__main__': time1=datetime.now() result=detectFaces('9.jpg') time2=datetime.now() print("耗時:"+str(time2-time1)) if len(result)>0: print("有人存在?。?--》人數(shù)為:"+str(len(result))) else: print('視頻圖像中無人??!') drawFaces('9.jpg') # drawEyes('obama.jpg') # drawSmiles('obama.jpg') # saveFaces('obama.jpg') """ 上面的代碼將眼睛、人臉、笑臉在不同的圖像上框出,如果需要在同一張圖像上框出,改一下代碼就可以了。 總之,利用opencv里訓(xùn)練好的haar特征的xml文件,在圖片上檢測出人臉的坐標(biāo),利用這個坐標(biāo),我們可以將人臉區(qū)域剪切保存,也可以在原圖上將人臉框出。剪切保存人臉以及用矩形工具框出人臉,本程序使用的是PIL里的Image、ImageDraw模塊。 此外,opencv里面也有畫矩形的模塊,同樣可以用來框出人臉。 """
看完上述內(nèi)容,你們掌握如何在python中利用Opencv實(shí)現(xiàn)一個人臉識別功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。