iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
4
Software Development

糊裡糊塗Python就上手系列 第 30

[2020鐵人賽Day30]糊裡糊塗Python就上手-體驗 OpenCV 人臉辨識

今日目標

輕鬆小品,來點 OpenCV 人臉辨識的實作

What is OpenCV?

OpenCV(Open Source Computer Vision)是一個跨平台的電腦視覺庫,包含許多電腦視覺相關演算處理的Open Source Library,而且支援多種開法語言,同時 OpenCV 也可以在手機APP(Android、iOS)上開發

Install OpenCV

使用 Command line,並運用 pip install 安裝 OpenCV
相關說明文件:pypi opencv-python

pip install opencv-python

https://ithelp.ithome.com.tw/upload/images/20201015/20091333NYUIzaA0K3.png

實際體驗

事前準備

在 Google 圖片上,搜尋到這張圖片,就用來這次的體驗,將他放於我們將要執行的 Code 同一層位置,命名為「human.jpg」
https://ithelp.ithome.com.tw/upload/images/20201015/20091333Hv5iZbpa1Y.jpg

導入 OpenCV 模組

import cv2

建立 detectFace Function 並可帶入 img 圖片名稱變數

def detectFace(img):

取得將使用的檔案名稱,並讀取圖檔,接著把圖檔透過轉換函式轉為灰階影像,定義框出人臉時的框顏色

    filename = img.split(".")[0] # 取得檔案名稱(不添加副檔名)
    img = cv2.imread(img) # 讀取圖檔
    grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 透過轉換函式轉為灰階影像
    color = (0, 255, 0)  # 定義框的顏色

建立 OpenCV 的人臉識別分類器

    # OpenCV 人臉識別分類器
    face_classifier = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

調用偵測識別人臉函式,並框出偵測到的每一張人臉

detectMultiScale函數,它可以偵測出圖片中所有的人臉,其參數為:

參數 說明
image 待檢測圖片,一般為灰階影像,以便加快偵測速度
scaleFactor 在前後兩次相繼的掃描中,搜索範圍的比例係數,默認值為 1.1
minNeighbors 構成偵測目標的相鄰矩形的最小個數,默認值為 3
minSize & maxSize 用來限制得到的目標區域範圍
    # 調用偵測識別人臉函式
    faceRects = face_classifier.detectMultiScale(
        grayImg, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    
    # 大於 0 則檢測到人臉
    if len(faceRects):  
        # 框出每一張人臉
        for faceRect in faceRects: 
            x, y, w, h = faceRect
            cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)

將結果圖片輸出

    # 將結果圖片輸出
    cv2.imwrite(filename + "_face.jpg", img)

完整代碼

import cv2

def detectFace(img):
    filename = img.split(".")[0] # 取得檔案名稱(不添加副檔名)
    img = cv2.imread(img) # 讀取圖檔
    grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 透過轉換函式轉為灰階影像
    color = (0, 255, 0)  # 定義框的顏色
    
    # OpenCV 人臉識別分類器
    face_classifier = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
    
    # 調用偵測識別人臉函式
    faceRects = face_classifier.detectMultiScale(
        grayImg, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    
    # 大於 0 則檢測到人臉
    if len(faceRects):  
        # 框出每一張人臉
        for faceRect in faceRects: 
            x, y, w, h = faceRect
            cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
    
    # 將結果圖片輸出
    cv2.imwrite(filename + "_face.jpg", img)
    
detectFace('human.jpg')

執行後輸出結果:
https://ithelp.ithome.com.tw/upload/images/20201015/20091333l1N9XfcStS.jpg

結論

此篇僅是體驗 OpenCV 人臉辨識的有趣之處,因此不會說得很深入,很多觀念還需要自行查詢學習
此系列文章,已經到一段落,雖然內容不是寫得很好(我有自知之明/images/emoticon/emoticon39.gif)
但希望此篇文章的學習紀錄,可以幫助到剛踏入 Python 這條不歸路 不對,是這領域時可以順利的上手學習/images/emoticon/emoticon01.gif


上一篇
[2020鐵人賽Day29]糊裡糊塗Python就上手-Pandas的觀念與運用(下)
系列文
糊裡糊塗Python就上手30

尚未有邦友留言

立即登入留言