python利用Opencv實現(xiàn)人臉識別功能
更新時間:2019年04月25日 15:11:51 作者:wsywb111
這篇文章主要為大家詳細介紹了python利用Opencv實現(xiàn)人臉識別功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了python利用Opencv實現(xiàn)人臉識別功能的具體代碼,供大家參考,具體內(nèi)容如下
首先:需要在在自己本地安裝opencv具體步驟可以問度娘
如果從事于開發(fā)中的話建議用第三方的人臉識別(推薦阿里)
1、視頻流中進行人臉識別
# -*- 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
# 將當前幀轉(zhuǎn)換成灰度圖像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數(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('視頻中有人?。?)
else:
print('視頻中無人??!')
2、通過圖片識別人臉
#-*-coding:utf8-*-#
import os
import cv2
from PIL import Image,ImageDraw
from datetime import datetime
import time
#detectFaces()返回圖像中所有人臉的矩形坐標(矩形左上、右下頂點)
#使用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返回的坐標),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實例,然后調(diào)用該draw實例的rectangle方法畫矩形(矩形的坐標即
#detectFaces返回的坐標),outline是矩形線條顏色(B,G,R)。
#注:原始圖像如果是灰度圖,則去掉outline,因為灰度圖沒有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)
#檢測眼睛,返回坐標
#由于眼睛在人臉上,我們往往是先檢測出人臉,再細入地檢測眼睛。故detectEyes可在detectFaces基礎(chǔ)上來進行,代碼中需要注意“相對坐標”。
#當然也可以在整張圖片上直接使用分類器,這種方法代碼跟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文件,在圖片上檢測出人臉的坐標,利用這個坐標,我們可以將人臉區(qū)域剪切保存,也可以在原圖上將人臉框出。剪切保存人臉以及用矩形工具框出人臉,本程序使用的是PIL里的Image、ImageDraw模塊。
此外,opencv里面也有畫矩形的模塊,同樣可以用來框出人臉。
"""
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- python實現(xiàn)圖片,視頻人臉識別(opencv版)
- Python基于Opencv來快速實現(xiàn)人臉識別過程詳解(完整版)
- Python opencv實現(xiàn)人眼/人臉識別以及實時打碼處理
- Python基于OpenCV庫Adaboost實現(xiàn)人臉識別功能詳解
- python調(diào)用OpenCV實現(xiàn)人臉識別功能
- python opencv3實現(xiàn)人臉識別(windows)
- 基于python3 OpenCV3實現(xiàn)靜態(tài)圖片人臉識別
- python+opencv實現(xiàn)的簡單人臉識別代碼示例
- 詳解如何用OpenCV + Python 實現(xiàn)人臉識別
- python使用opencv進行人臉識別
- python基于opencv實現(xiàn)人臉識別
相關(guān)文章
django-simple-captcha多種驗證碼的實現(xiàn)方法
本文介紹了如何在Django項目中配置和使用不同類型的驗證碼,包括數(shù)字驗證碼、字母驗證碼和算術(shù)驗證碼,每種驗證碼結(jié)合實例代碼給大家介紹得非常詳細,感興趣的朋友跟隨小編一起看看吧2024-12-12
Python多線程與多進程相關(guān)知識總結(jié)
進程(process)和線程(thread)是操作系統(tǒng)的基本概念,是操作系統(tǒng)程序運行的基本單元,本文簡要介紹進程和線程的概念以及Python中的多進程和多線程.需要的朋友可以參考下2021-05-05
Python實現(xiàn)數(shù)據(jù)庫并行讀取和寫入實例
本篇文章主要介紹了Python實現(xiàn)數(shù)據(jù)庫并行讀取和寫入實例,非常具有實用價值,需要的朋友可以參考下2017-06-06
詳解如何利用tushare、pycharm和excel三者結(jié)合進行股票分析
這篇文章主要介紹了詳解如何利用tushare、pycharm和excel三者結(jié)合進行股票分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2021-04-04

