中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在python中利用Opencv實現一個人臉識別功能

發布時間:2021-04-20 16:24:33 來源:億速云 閱讀:183 作者:Leah 欄目:開發技術

如何在python中利用Opencv實現一個人臉識別功能?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

python是什么意思

Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向對象的腳本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發獨立的項目和大型項目。

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() # 讀取一幀數據
    if not ok:
      break
 
      # 將當前幀轉換成灰度圖像
    grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數
    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("識別人臉區域", '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特征的級聯分類器haarcascade_frontalface_default.xml,在haarcascades目錄下還有其他的訓練好的xml文件可供選擇。
#注:haarcascades目錄下訓練好的分類器必須以灰度圖作為輸入。
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,說明不是灰度圖,先轉化為灰度圖gray,如果不為3,也就是2,原圖就是灰度圖
 
  faces = face_cascade.detectMultiScale(gray, 1.2, 5)#1.3和5是特征的最小、最大檢測窗口,它改變檢測結果也會改變
  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剪切圖像(剪切的區域就是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
 
#在原圖像上畫矩形,框出所有人臉。
#調用Image模塊的draw方法,Image.open獲取圖像句柄,ImageDraw.Draw獲取該圖像的draw實例,然后調用該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基礎上來進行,代碼中需要注意“相對坐標”。
#當然也可以在整張圖片上直接使用分類器,這種方法代碼跟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,說明不是灰度圖,先轉化為灰度圖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("有人存在!!---》人數為:"+str(len(result)))
  else:
    print('視頻圖像中無人!!')
 
  drawFaces('9.jpg')
  # drawEyes('obama.jpg')
  # drawSmiles('obama.jpg')
  # saveFaces('obama.jpg')
 
"""
上面的代碼將眼睛、人臉、笑臉在不同的圖像上框出,如果需要在同一張圖像上框出,改一下代碼就可以了。
總之,利用opencv里訓練好的haar特征的xml文件,在圖片上檢測出人臉的坐標,利用這個坐標,我們可以將人臉區域剪切保存,也可以在原圖上將人臉框出。剪切保存人臉以及用矩形工具框出人臉,本程序使用的是PIL里的Image、ImageDraw模塊。
此外,opencv里面也有畫矩形的模塊,同樣可以用來框出人臉。
"""

看完上述內容,你們掌握如何在python中利用Opencv實現一個人臉識別功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太谷县| 高要市| 沿河| 巢湖市| 广德县| 博客| 绥德县| 衡阳县| 常熟市| 东兴市| 鹿泉市| 宁乡县| 巴林左旗| 合江县| 寿光市| 新化县| 兴国县| 昆明市| 毕节市| 油尖旺区| 射洪县| 化德县| 洮南市| 江川县| 榕江县| 宝坻区| 同仁县| 富川| 英山县| 宁海县| 娄烦县| 沙河市| 通辽市| 安国市| 常德市| 霍州市| 简阳市| 舒兰市| 象州县| 安庆市| 普定县|