天天看點

《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測

本專欄主要介紹如果通過OpenCv-Python進行圖像處理,通過原理了解OpenCv-Python的函數處理原型,在具體情況中,針對不同的圖像進行不同等級的、不同方法的處理,以達到對圖像進行去噪、銳化等一系列的操作。同時,希望觀看本專欄的小夥伴可以了解到OpenCv進行圖像處理的強大哦,如有轉載,請注明出處(原文連結和作者署名),感謝各位小夥伴啦!

前文參考:

《OpenCv視覺之眼》Python圖像處理一 :Opencv-python的簡介及Python環境搭建

《OpenCv視覺之眼》Python圖像處理二 :Opencv圖像讀取、顯示、儲存基本函數原型及使用

《OpenCv視覺之眼》Python圖像處理三 :Opencv圖像屬性、ROI區域擷取及通道處理

《OpenCv視覺之眼》Python圖像處理四 :Opencv圖像灰階處理的四種方法及原理

《OpenCv視覺之眼》Python圖像處理五 :Opencv圖像去噪處理之均值濾波、方框濾波、中值濾波和高斯濾波

《OpenCv視覺之眼》Python圖像處理六 :Opencv圖像傅裡葉變換和傅裡葉逆變換原理及實作

《OpenCv視覺之眼》Python圖像處理七 :Opencv圖像處理之高通濾波和低通濾波原理及構造

《OpenCv視覺之眼》Python圖像處理八 :Opencv圖像處理之圖像門檻值化處理原理及函數

《OpenCv視覺之眼》Python圖像處理九 :Opencv圖像形态學處理之圖像腐蝕與膨脹原理及方法

《OpenCv視覺之眼》Python圖像處理十 :Opencv圖像形态學處理之開運算、閉運算和梯度運算原理及方法

《OpenCv視覺之眼》Python圖像處理十一 :Opencv圖像形态學處理之頂帽運算與黑帽運算

《OpenCv視覺之眼》Python圖像處理十二 :Opencv圖像輪廓提取之基于一階導數的Roberts算法、Prewitt算法及Sobel算法

《OpenCv視覺之眼》Python圖像處理十三 :Opencv圖像輪廓提取之基于二階導數的Laplacian算法和LOG算法

《OpenCv視覺之眼》Python圖像處理十四 :Opencv圖像輪廓提取之Scharr算法和Canny算法

《OpenCv視覺之眼》Python圖像處理十五 :Opencv圖像處理之圖像縮放、旋轉和平移原理及實作

《OpenCv視覺之眼》Python圖像處理十六:Opencv項目實戰之圖像中的硬币檢測

《OpenCv視覺之眼》Python圖像處理十七:Opencv圖像處理實戰二之圖像中的物體識别并截取

上次部落格我們介紹了OpenCV圖像處理實戰二,圖像中的物體識别,也說了以上步驟的目的是為了給神經網絡模型訓練打基礎,摳出物體中我們需要的人臉部分,當然,改步驟還可以通過OpenCV提供的人臉檢測模型來進行檢測人臉然後摳出;本次部落格,林君學長主要帶大家了解如何通過OpenCV自帶的人臉檢測訓練模型來進行人臉檢測并标注檢測的位置,一起學習吧!

OpenCV圖像處理實戰三:基于OpenCV訓練模型的AI人臉檢測

[Python圖像處理十八]:Opencv圖像處理實戰三之基于OpenCV的訓練模型的AI人臉檢測

  • 一、OpenCV人臉檢測函數介紹
    • 1、OpenCV人臉檢測模型介紹
    • 2、cv2.CascadeClassifier分類器函數介紹
    • 3、detectMultiScale()人臉檢測算法介紹
    • 4、cv2.rectangle()繪制矩形人臉框
    • 5、cv2.circle()繪制圓圈人臉框
  • 二、OpenCV人臉檢測
    • 1、OpenCV實作人臉檢測步驟
    • 2、圖像人臉檢測完整代碼
    • 3、視訊人臉檢測完整代碼
    • 4、攝像頭人臉檢測完整代碼

一、OpenCV人臉檢測函數介紹

下面講解到的函數都是我們通過OpenCV實作人臉檢測将要用到的函數,接下來将會對每個函數的作用及功能進行講解,最終實作對圖檔人臉的檢測!

1、OpenCV人臉檢測模型介紹

1)、OpenCV人臉檢測模型即haarcascade_frontalface_default.xml模型檔案,該模型是OpenCV官方訓練好的人臉正臉檢測模型,是OpenCV正面人臉檢測級聯分類器訓練結果,在通過OpenCV對圖像中的人臉鍵檢測時,我們必須要用到該模型,至于該模型的訓練,本次部落格将暫時不做講解,後面會講到該模型是如何通過OpenCV分類器進行訓練的

2)、本次部落格的圖像人臉檢測利用cv2.CascadeClassifier級聯分類器的haarcascade_frontalface_default.xml進行正臉人臉預測,我們可以看到介紹,是專注于正臉檢測,是以,該模型的缺點就是隻能對人臉正臉進行檢測,優點是人臉正臉檢測速度快,準确率高

3)、haarcascade_frontalface_default.xml模型位置

haarcascade_frontalface_default.xml模型在下載下傳opencv-python的時候,會自動下載下傳該模型,我們隻需要找到python的安裝路徑,在安裝路徑下找到pip下載下傳的庫存放的位置,就可以找到該模型,如下:

《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測

2、cv2.CascadeClassifier分類器函數介紹

1)、函數原型:result=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)

  • haarcascade_frontalface_default.xml:OpenCV官方正臉人臉檢測模型

2)、該函數是OpenCV中人臉檢測的一個級聯分類器,既可以使用Haar,也可以使用LBP特征。以Haar特征分類器為基礎的對象檢測技術是一種非常有效的技術。它是基于機器學習且使用大量的正負樣本訓練得到分類器。

  • Haar-like矩形特征:是用于物體檢測的數字圖像特征。這類矩形特征模闆由兩個或多個全等的黑白矩形相鄰組合而成,而矩形特征值是白色矩形的灰階值的和減去黑色矩形的灰階值的和,矩形特征對一些簡單的圖形結構,如線段、邊緣比較敏感。如果把這樣的矩形放在一個非人臉區域,那麼計算出的特征值應該和人臉特征值不一樣,是以這些矩形就是為了把人臉特征量化,以區分人臉和非人臉
  • LBP:是一種特征提取方式,能提取出圖像的局部的紋理特征,最開始的LBP算子是在3X3視窗中,取中心像素的像素值為閥值,與其周圍八個像素點的像素值比較,若像素點的像素值大于閥值,則此像素點被标記為1,否則标記為0。這樣就能得到一個八位二進制的碼,轉換為十進制即LBP碼,于是得到了這個視窗的LBP值,用這個值來反映這個視窗内的紋理資訊

3、detectMultiScale()人臉檢測算法介紹

1)、函數原型:result1=result.detectMultiScale(image,scaleFactor,minNeighbors,minSize,minSize)

  • result:聯級分類器得到的結果
  • image:需要鍵人臉檢測的圖像
  • result1:檢測到的人臉目标序列
  • scaleFactor:圖像尺寸減小的比例
  • minNeighbors:每一個目标至少要被檢測的次數,知道檢測到這麼多次才算是真的目标,因為周圍的像素和不同的視窗大小都可以檢測到人臉
  • minSize:目标的最小尺寸(選填)
  • minSize:目标的最大尺寸(選填)

detectMultiScale()是檢測人臉算法,通過該函數實作OpenCV對圖像中正人臉的檢測

4、cv2.rectangle()繪制矩形人臉框

函數原型: cv2.rectangle(image, start_point, end_point, color, thickness)

  • image:需要進行矩形框繪制的圖像
  • start_point:矩形的起始坐标。坐标表示為兩個值的元組,即(X坐标值,Y坐标值)
  • end_point:矩形的結束坐标。坐标表示為兩個值的元組,即(X坐标值,Y坐标值)。
  • color:繪制的矩形的邊界線的顔色。對于BGR,我們通過一個元組。例如:(255,0,0)為藍色
  • thickness:矩形邊框線的粗細像素。厚度-1像素将以指定的顔色填充矩形形狀

通過該函數對檢測出來的人臉進行标注,标注的方式為方框。下面将會講到另一種标注方式(圓圈)這兩種标注方式選擇其中一種就OK,有關更多的OpenCV圖像繪圖函數,請參考如下部落格連接配接:python-opencv繪圖函數

5、cv2.circle()繪制圓圈人臉框

函數原型:cv2.circle(img,center,radius,color,thickness)

  • img:需要進行圓圈繪制的圖像
  • center:圓心,即(X坐标值,Y坐标值)
  • radius:半徑
  • color:繪制的圓圈的邊界線的顔色。對于BGR,我們通過一個元組。例如:(255,0,0)為藍色
  • thickness:矩形邊框線的粗細像素。厚度-1像素将以指定的顔色填充矩形形狀

該函數為圓圈标注函數,在圖像中通過圓圈的方式在原圖像上繪制出檢測出來的人臉,同樣的,按照自己的需求與方框繪制函數進行選擇

二、OpenCV人臉檢測

在進行人臉檢測的開始,我們需要注意的是,人臉檢測與人臉識别是有差別的,人間檢測隻是将圖像中的人檢測出來,然後将人臉進行标注;而人臉識别除了需要将圖像中的人臉檢測出來,還需要識别出該圖像中對應的人臉是誰,同時也标注出來,這是差別,本次部落客要講解人臉檢測,對于人臉識别将在後面部落格章節進行講解,記得關注訂閱哦!

1、OpenCV實作人臉檢測步驟

1)、導入OpenCV函數庫并讀取人臉圖像

#導入函數庫
import cv2
# 讀取原始圖像
img = cv2.imread('peng.jpg')
           

2)、建構聯級分類器

#建構聯級分類器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
           

注意聯級分類器中模型的在python路徑中的位置

3)、通過聯級分類器的結果進行人臉檢測,設定至少檢測5次才算檢測人臉成功

# 檢查人臉 按照1.1倍放到 周圍最小像素為5
face = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)
           

檢測到的結果face包括檢測到人臉的寬和高,人臉的起始位置,以圖像左上角為起點,向右為x,向左為y

4)、将檢測到的人臉繪制到原圖,方框或者圓圈二選一

OpenCV的圖像格式都是[B、G、R]格式的,也就是[藍、綠、紅],在進行矩形或者圓框設定的時候請注意
# 繪制矩形或者圓形檢測人臉
for x, y, w, h in face:
    # 繪制綠色矩形人臉區域 thickness表示線的粗細
    cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
    # 繪制紅色圓形人臉區域 radius表示半徑
    #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
           

5)、顯示檢測出來的人臉

# 顯示圖檔
cv2.imshow("faceDetection", img)
# 等待顯示 設定任意鍵退出程式
cv2.waitKey(0)
           

2、圖像人臉檢測完整代碼

1)、OpenCV圖像人臉檢測完整代碼

'''
    OpenCV人臉檢測
'''
#導入函數庫
import cv2
# 讀取原始圖像
img = cv2.imread('peng.jpg')
#建構聯級分類器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
# 檢查人臉 按照1.1倍放到 周圍最小像素為5
face = face_detect.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)
for x, y, w, h in face:
    # 繪制綠色矩形人臉區域 thickness表示線的粗細
    cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
    # 繪制紅色圓形人臉區域 radius表示半徑
    #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
# 顯示圖檔
cv2.imshow("faceDetection", img)
# 等待顯示 設定任意鍵退出程式
cv2.waitKey(0)
           

2)、檢測結果

  • 單人檢測結果
《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測
  • 多人檢測結果
    《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測

3)、在部落格開始的時候說到,haarcascade_frontalface_default.xml模型針對的是正臉的檢測,對側臉或者是檢測不出來的,這裡我們測試一下,如下側臉檢測:

  • 第一張側臉的識别:
    《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測
  • 第二張側臉的識别:
    《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測
由上面我們可以得出結論,彭于晏的帥連算法都能get到,是以,彭于晏是帥的,我也是帥的,哈哈!彭于晏=帥=林君學長

正确結論:haarcascade_frontalface_default.xml人臉檢測模型對正臉的識别率為95%以上,而對于側臉的識别,與側臉凸顯的人臉面積大小和光線強度有關,也就是說,你的臉越大,用的美顔強度越強,你的側臉對機器視覺來講也就越帥,因為機器和算法檢測到你哇!

3、視訊人臉檢測完整代碼

1)、視訊人臉檢測完整代碼

'''
    OpenCV視訊人臉檢測
'''
#導入函數庫
import cv2
import numpy as np
# 加載視訊
cap = cv2.VideoCapture('zhang.mp4')
#建構聯級分類器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while True:
    # 按幀讀取視訊片段
     #flag:傳回值為True和False,True和圖檔一起傳回,當讀完視訊後傳回False
    #frame:接受傳回來的圖檔
    flag, frame = cap.read()
    #判斷視訊是否讀取完
    if flag == False:
        break
    # 對每一幀圖像進行灰階處理
    gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
   # 檢查人臉 按照1.1倍放到 周圍最小像素為5
    face = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    # 繪制矩形和圓形檢測人臉
    for x, y, w, h in face:
        # 繪制綠色矩形人臉區域 thickness表示線的粗細
        cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
        # 繪制紅色圓形人臉區域 radius表示半徑
        #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
    # 顯示圖檔
    cv2.imshow('video-faceDetection',frame)
    # 設定q退出鍵和展示頻率
    if ord('q') == cv2.waitKey(2):
        break
# 釋放視窗和攝像頭
cv2.destroyAllWindows()
cap.release()
           

2)、視訊人臉檢測結果

《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測

4、攝像頭人臉檢測完整代碼

攝像頭人臉檢測和視訊人臉檢測的代碼基本一緻,唯一差別就是将讀取的視訊改為讀取筆記本預設攝像頭,如下

1)、攝像頭人臉檢測完整代碼

'''
    OpenCV攝像頭人臉檢測
'''
#導入函數庫
import cv2
import numpy as np
# 參數0為加載預設攝像頭
cap = cv2.VideoCapture(0)
#建構聯級分類器
face_detect = cv2.CascadeClassifier('D:\python\python1\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while True:
    # 讀取視訊片段
    flag, frame = cap.read()
    #判斷視訊是否讀取完
    if flag == False:
        break
    # 對每一幀圖像進行灰階處理
    gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
   # 檢查人臉 按照1.1倍放到 周圍最小像素為5
    face = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    # 繪制矩形和圓形檢測人臉
    for x, y, w, h in face:
        # 繪制綠色矩形人臉區域 thickness表示線的粗細
        cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h),color=[0,255,0], thickness=2)
        # 繪制紅色圓形人臉區域 radius表示半徑
        #cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)
    # 顯示圖檔
    cv2.imshow('video-faceDetection',frame)
    # 設定q退出鍵和展示頻率
    if ord('q') == cv2.waitKey(2):
        break
# 釋放視窗和攝像頭
cv2.destroyAllWindows()
cap.release()
           

2)、攝像頭人臉檢測結果

《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基于OpenCV訓練模型的AI人臉檢測一、OpenCV人臉檢測函數介紹二、OpenCV人臉檢測
都說了 彭于晏=帥=我,非要不相信,現在相信了吧!

以上就是本次部落格的全部内容,遇到問題的小夥伴記得留言評論,學長看到會為大家進行解答的,這個學長不太冷!

不經曆星期一上午的崩潰,就不知道星期五下午的可貴。

陳一月的又一天程式設計歲月^ _ ^

繼續閱讀