日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

發(fā)布時間:2024/1/8 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先:需要在在自己本地安裝opencv具體步驟可以問度娘

如果從事于開發(fā)中的話建議用第三方的人臉識別(推薦阿里)

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分別為圖片縮放比例和需要檢測的有效點數(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()返回圖像中所有人臉的矩形坐標(biāo)(矩形左上、右下頂點)

#使用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實例,然后調(diào)用該draw實例的rectangle方法畫矩形(矩形的坐標(biāo)即

#detectFaces返回的坐標(biāo)),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)

#檢測眼睛,返回坐標(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里面也有畫矩形的模塊,同樣可以用來框出人臉。

"""

總結(jié)

以上是生活随笔為你收集整理的python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。