0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV人臉監(jiān)測與識別步驟

新機器視覺 ? 來源:古月居 ? 2023-05-15 09:18 ? 次閱讀

人臉識別技術(shù)是基于人的臉部特征,對輸入的人臉圖像或者視頻流,首先判斷其是否存在人臉,如果存在人臉,則進一步的給出每個臉的位置、大小和各個主要面部器官的位置信息。

并依據(jù)這些信息,進一步提取每個人臉中所蘊涵的身份特征,并將其與已知的人臉進行對比,從而識別每個人臉的身份。

1. 人臉識別步驟

梳理一下人臉識別實現(xiàn)的步驟,主要由人臉采集,預(yù)處理,特征提取,匹配與識別四個步驟組成

bedca496-f2b5-11ed-90ce-dac502259ad0.png

2. 人臉監(jiān)測

人臉識別首先應(yīng)該先實現(xiàn)人臉監(jiān)測,要先在一張圖片中捕獲到人臉,再去識別圖片中的人臉和數(shù)據(jù)庫中人臉數(shù)據(jù)進行比較。

人臉檢測的最常見方法是使用"Haar 分類器"?;?Haar 功能的級聯(lián)分類器的對象檢測是 Paul Viola 和 Michael Jones 提出的一種有效的對象檢測、基于機器學(xué)習(xí)的方法。

進行人臉檢測需要大量的圖像數(shù)據(jù)來訓(xùn)練分類器,然后從中提取特征,使用OpenCV可以進行人臉的訓(xùn)練和推理,也可以訓(xùn)練自己的分類器為任何對象進行分類,同時OpenCV包含許多預(yù)先訓(xùn)練過的分類器,我們只需要調(diào)用OpenCV的接口就可以。

代碼如下:

#導(dǎo)入cv模塊
import cv2 as cv
#檢測函數(shù)
def face_detect():
  gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  face_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
  face = face_detect.detectMultiScale(gary)
  for x,y,w,h in face:
    cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
  cv.imshow('result',img)


#讀取圖像
img = cv.imread('face2.jpg')
#檢測函數(shù)
face_detect()
#等待
while True:
  if ord('q') == cv.waitKey(0):
    break
#釋放內(nèi)存
cv.destroyAllWindows()

在代碼中,首先對讀取的圖像進行了灰度處理,然后引入級聯(lián)分類器文件,通過detectMultiScale()函數(shù)來調(diào)用分類器功能

通過rectangle()函數(shù)來標記圖像中的面孔,如果發(fā)現(xiàn)人臉,它會返回檢測到的面部位置,作為左上角(x,y)的矩形,并將”w”作為寬度,將”h”作為高度 。

運行效果如下:

bef22e6a-f2b5-11ed-90ce-dac502259ad0.png

3. 錄入人臉功能模塊

導(dǎo)入第三方庫:

import cv2
import os
from PIL import Image
import numpy as np

OS:主要是對文件和文件夾進行操作,在Python中對?件和?件夾的操作要借助os模塊??的相關(guān)功能。

PIL:python中最常用的圖形處理庫,PIL支持圖像存儲、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對圖像的縮放、裁剪、疊加以及圖像添加線條、圖像和文字等操作。

NumPy:一個由多維數(shù)組對象和用于處理數(shù)組的例程集合組成的庫??梢詧?zhí)行以下操作:數(shù)組的算數(shù)和邏輯運算。傅立葉變換和用于圖形操作的例程。與線性代數(shù)有關(guān)的操作。NumPy 擁有線性代數(shù)和隨機數(shù)生成的內(nèi)置函數(shù)。

存儲人臉數(shù)據(jù):

facesSamples=[]

存儲姓名數(shù)據(jù):

ids=[]

存儲圖片信息:

imagePaths=[os.path.join(path,f) for f in os.listdir(path)]

加載分類器:

face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml'

遍歷列表中的圖片:

for imagePath in imagePaths:

將打開的圖片灰度化:

PIL_img = Image.open(imagePath).convert('L')

將圖片轉(zhuǎn)化為數(shù)組:

img_numpy = np.array(PIL_img,'uint8')

獲取圖片人臉特征:

faces = face_detector.detectMultiScale(img_numpy)

獲取每一張拍攝圖片的id與姓名:

id = int(os.path.split(imagePath)[1].split('.')[0])

做判斷,預(yù)防拍攝無面容圖片:

for x,y,w,h in faces:
   ids.append(id)
   facesSamples.append(img_numpy[y:y+h,x:x+w])

打印面部特征與id,并返回數(shù)據(jù):

 print('id',id)
print('fs:',facesSamples)
return facesSamples,ids

調(diào)用圖片路徑:

path='./data/jm/'

獲取圖像數(shù)組和id標簽數(shù)組和姓名:

faces,ids=getImageAndLabels(path)

加載識別器:

recognizer = cv2.face.LBPHFaceRecognizer_create()

訓(xùn)練數(shù)據(jù):

recognizer.train(faces,np.array(ids))

保存面部特征到文件夾:

recognizer.write('tupian/tupian.yml')

完整代碼如下:

import os
import cv2
from PIL import Image
import numpy as np


def getImageAndLabels(path):
  facesSamples=[]
  ids=[]
  imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  #檢測人臉
  face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
  #打印數(shù)組imagePaths
  print('數(shù)據(jù)排列:',imagePaths)
  #遍歷列表中的圖片
  for imagePath in imagePaths:
    #打開圖片,黑白化
    PIL_img=Image.open(imagePath).convert('L')
    #將圖像轉(zhuǎn)換為數(shù)組,以黑白深淺
    # PIL_img = cv2.resize(PIL_img, dsize=(400, 400))
    img_numpy=np.array(PIL_img,'uint8')
    #獲取圖片人臉特征
    faces = face_detector.detectMultiScale(img_numpy)
    #獲取每張圖片的id和姓名
    id = int(os.path.split(imagePath)[1].split('.')[0])
    #預(yù)防無面容照片
    for x,y,w,h in faces:
      ids.append(id)
      facesSamples.append(img_numpy[y:y+h,x:x+w])


    print('id:', id)


  print('fs:', facesSamples)


  return facesSamples,ids


if __name__ == '__main__':
  #圖片路徑
  path='./data/jm/'
  #獲取圖像數(shù)組和id標簽數(shù)組和姓名
  faces,ids=getImageAndLabels(path)
  #獲取訓(xùn)練對象
  recognizer=cv2.face.LBPHFaceRecognizer_create()
  #recognizer.train(faces,names)#np.array(ids)
  recognizer.train(faces,np.array(ids))
  #保存文件
  recognizer.write('trainer/trainer.yml')
  #save_to_file('names.txt',names)

4. 人臉識別

人臉識別器已經(jīng)完成,現(xiàn)在要在相機上捕獲人臉。如果此人之前拍攝并訓(xùn)練過他的臉,識別器將做出預(yù)測,返回ID名。

使用剛剛訓(xùn)練的識別器模型(加載trainer.yml),然后就和剛剛“人臉分類器”的步驟一樣去進行人臉識別,并且recognizer.predict將返回每張圖片識別后的匹配率。

人臉識別實現(xiàn)函數(shù)如下:

def face_detect(img):
  gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉(zhuǎn)換為灰度
  face_detector=cv2.CascadeClassifier(r'haarcascade_frontalface_alt2.xml')
  face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))
  #face=face_detector.detectMultiScale(gray)
  for x,y,w,h in face:
    cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
    # 人臉識別
    ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
    #print('標簽id:',ids,'置信評分:', confidence)
    if confidence > 80:
      cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    else:
      cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
  cv2.imshow('result',img)

添加名字標簽:

#名字標簽
def name():
  path = './tupian/'
  # names = []
  imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  for imagePath in imagePaths:
    name = str(os.path.split(imagePath)[1].split('.',2)[1])
    names.append(name)

加載監(jiān)控或已保存下來的視頻:

#加載視頻
cap=cv2.VideoCapture(8)
name()
while True:
  flag,frame=cap.read()
  if not flag:
    break
  face_detect_demo(frame)
  if ord(' ') == cv2.waitKey(10):
    break
#釋放內(nèi)存+視頻
cv2.destroyAllWindows()
cap.release()

最終效果如下

bf1c8b1a-f2b5-11ed-90ce-dac502259ad0.png

bf3ec0b8-f2b5-11ed-90ce-dac502259ad0.jpg

5. 遇到的問題

旭日x3派并沒有opencv-contrib-python庫,需要通過

pip install opencv-contrib-python

進行安裝

用OPENCV出現(xiàn)這樣的錯誤:

cpp error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

這個錯誤可能是因為圖片路徑形式書寫錯誤,圖片的格式不對,圖片的數(shù)量不一致,路徑中存在中文導(dǎo)致




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 人臉識別技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    127

    瀏覽量

    14723
  • 傅立葉變換
    +關(guān)注

    關(guān)注

    3

    文章

    105

    瀏覽量

    32801
  • OpenCV
    +關(guān)注

    關(guān)注

    32

    文章

    642

    瀏覽量

    42487
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86277
  • PIL
    PIL
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    8791

原文標題:OpenCV人臉識別系統(tǒng)開發(fā)(一):OpenCV人臉監(jiān)測與識別

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    樹莓派上使用OpenCV和Python實現(xiàn)實時人臉檢測

    本文介紹了如何在樹莓派上,使用 OpenCV 和 Python 完成人臉檢測項目。該項目不僅描述了識別人臉所需要的具體步驟,同時還提供了很多擴展知識。此外,該項目并不需要讀者了解詳細的
    的頭像 發(fā)表于 03-06 09:00 ?5.2w次閱讀

    基于openCV人臉檢測系統(tǒng)的設(shè)計

    通過對基于Adaboost人臉檢測算法的研究,利用該算法與計算機視覺類庫openCV進行人臉檢測系統(tǒng)的設(shè)計,實現(xiàn)了對出現(xiàn)在視頻或圖像中的人臉檢測。此外,在VC++6.0環(huán)境下實現(xiàn)了對一
    發(fā)表于 12-23 14:19

    【NanoPi2申請】基于opencv人臉識別門禁系統(tǒng)

    防與監(jiān)控的系統(tǒng),望批準!謝謝!項目描述:項目簡述:本項目旨在一個較高性能的嵌入式平臺上搭建一個linux系統(tǒng),利用opencv編程實現(xiàn)人臉識別。為了實現(xiàn)圖像采集,需要編寫linux驅(qū)動對攝像頭的數(shù)據(jù)
    發(fā)表于 12-18 14:34

    【LeMaker Guitar申請】基于LeMaker Guitar的人臉識別系統(tǒng)

    學(xué)習(xí)對嵌入式應(yīng)用層開發(fā)有一個更深入的認識。項目描述:基于LeMaker Guitar的人臉識別系統(tǒng)設(shè)計思路是把 OpenCV移植到嵌入式操作系統(tǒng)中,然后將人臉
    發(fā)表于 01-18 16:23

    【LeMaker Guitar試用體驗】之基于Python下的人臉識別系統(tǒng)【結(jié)貼】

    本帖最后由 windworld 于 2017-1-22 11:26 編輯 OpenCV 作為開源的計算機視覺軟件包,在人臉識別方便也具有很廣泛的應(yīng)用,在這里我們采用opencv
    發(fā)表于 02-25 14:03

    LabVIE人臉識別

    labview編寫的工業(yè)級視覺軟件,自帶人臉識別功能,只有驗證過的技術(shù)人員才有權(quán)限修改參數(shù),是不是顯得軟件的安全性能很高?他山之石可以攻玉,結(jié)合opencv你就可以實現(xiàn)!廢話不多說直接上圖:以上是檢測效果
    發(fā)表于 05-12 17:29

    【Raspberry Pi 3試用體驗】+Opencv+python的人臉識別

    ;)看一下效果:光線不好還是能認出來,說明opencv自帶的分類器算開源里面不錯的了~參考:Tigerboard開發(fā)板試用體驗 python+opencv人臉識別 NanoPi2試用
    發(fā)表于 05-13 21:38

    【AI技能解析】人臉識別是怎么做到的?

    識別支付場景】人臉識別這么火,那么它到底是怎么實現(xiàn)的呢?看大牛為您解鎖人臉識別技術(shù)中的黑科技!中的圖片
    發(fā)表于 03-16 11:25

    基于QT+OpenCV人臉識別-米爾iMX8M Plus開發(fā)板的項目應(yīng)用

    本篇測評由電子工程世界的優(yōu)秀測評者“流行科技”提供。此次測試的開源項目,是基于QT+OpenCV人臉識別打卡項目。本次體驗使用的是開源的代碼,此代碼本來是運行在WIN下的,為了測試稍微進行了修改
    發(fā)表于 05-17 17:43

    【飛凌RK3568開發(fā)板試用體驗】使用OpenCV進行人臉識別

    RK3568四核Arm Cortex-A55 處理器的主板,從廠商的宣傳看,其主要市場就是人臉識別等視頻和圖像應(yīng)用。今天就使用OpenCV自帶的DNN模塊進行人臉
    發(fā)表于 01-11 22:06

    人臉識別

    OpenCV3編程入門》書本配套源代碼:人臉識別
    發(fā)表于 06-06 15:39 ?13次下載

    OpenCV3編程入門-源碼例程全集-人臉識別

    OpenCV3編程入門-源碼例程全集-人臉識別
    發(fā)表于 09-17 22:55 ?2次下載

    基于SeetaFace2和OpenCV實現(xiàn)人臉識別

    相信大部分同學(xué)們都已了解或接觸過OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)了,但你一定沒在OpenHarmony上實現(xiàn)過人臉識別功能,跟著本文帶你快速在OpenHarmony標準設(shè)備上基于SeetaFace2和
    的頭像 發(fā)表于 08-17 10:50 ?3597次閱讀

    使用DFRobot LattePanda進行OpenCV人臉識別

    電子發(fā)燒友網(wǎng)站提供《使用DFRobot LattePanda進行OpenCV人臉識別.zip》資料免費下載
    發(fā)表于 10-28 10:14 ?1次下載
    使用DFRobot LattePanda進行<b class='flag-5'>OpenCV</b><b class='flag-5'>人臉</b><b class='flag-5'>識別</b>

    基于OpenCV人臉識別系統(tǒng)設(shè)計

    基于OpenCV人臉識別系統(tǒng)是一個復(fù)雜但功能強大的系統(tǒng),廣泛應(yīng)用于安全監(jiān)控、人機交互、智能家居等多個領(lǐng)域。下面將詳細介紹基于OpenCV人臉
    的頭像 發(fā)表于 07-11 15:37 ?2.5w次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品