python基於opencv的人臉檢測(有最詳細的註釋)攝像頭實時檢測人臉

主要實現功能:

通過opencv的模塊的內置的方法打開電腦攝像頭,讀取每一幀數據進行分析。通過界面的方式在界面裏實時更新攝像頭視頻並且標記出人臉。

效果圖:

圖1

代碼:

這部分代碼可以用來檢測opencv的庫是否安裝正常。是直接調用opencv庫裏面調用攝像頭顯示圖像的方法,把攝像頭得到的每一幀圖像直接顯示在窗口裏,測試代碼如下:

#!/usr/bin/python3.7
# coding=utf-8

import cv2#導入opencv模塊
#捕捉幀,筆記本攝像頭設置爲0即可
""" VideoCapture是使用攝像頭的方法,
    可以有多個攝像頭,多以攝像頭的編號是從0開始
    VideoCapture第一個參數就是攝像頭編號"""
capture = cv2.VideoCapture(0)
#循環顯示幀
while(True):
    """讀取解碼攝像頭得到的每幀圖像,返回值第二個得到的每一幀圖像"""
    ok, frame = capture.read()
    """顯示窗口第一個參數是窗口名,第二個參數是內容"""
    cv2.imshow('Carmer', frame)
    """鍵盤按鍵等待延時,如果輸入按鍵q,則退出窗口"""
    if cv2.waitKey(1) == ord('q'):#按Q退出
        break

如果上面的程序可以正常在窗口裏顯示出來攝像頭拍攝的畫面,那麼說明可以正常使用opencv。
接下里需要去下載和安裝人臉識別級聯分類器opencv-CascadeClassifier
需要下載分類器:https://gitee.com/tianxiaohuahua/opencv.git
具體教程我參考了這位大神的博客:利用python、tensorflow、opencv實現人臉識別(包會)!
這裏需要注意一些問題,比如在填寫級聯分類器的文件路徑名稱時候,最好使用局對路徑。在使用絕對路徑的時候確實麻煩了半個小時找錯誤。
如果你正確下載了文件,但是報錯是

error(-215) !empty() in function detectMultiScale

那麼有極大的可能是因爲路徑的原因纔會有錯誤。需要認真的找到文件路徑。

對應文章開頭人臉識別以及眼睛識別的具體代碼如下:

#!/usr/bin/python3.7
# coding=utf-8
import cv2
"""功能:級聯分類器由若干簡單分類器和一個神經網絡分類器構成。
參數列表:級聯分類器文件路徑;
其他:  關於opencv-CascadeClassifier(級聯分類器)的初步認識 https://blog.csdn.net/sazass/article/details/89150468"""
face_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花語音機器人主程序/program/main/opencv/data/haarcascades/haarcascade_frontalface_default.xml") #告訴OpenCV使用人臉識別分類器
eye_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花語音機器人主程序/program/main/opencv/data/haarcascades/haarcascade_eye.xml") #告訴OpenCV使用眼睛識別分類器
"""功能:對opencv級聯分類器的分類
        人臉檢測器(默認):haarcascade_frontalface_default.xml 
        人臉檢測器(快速Harr):haarcascade_frontalface_alt2.xml 
        人臉檢測器(側視):haarcascade_profileface.xml 
        眼部檢測器(左眼):haarcascade_lefteye_2splits.xml 
        眼部檢測器(右眼):haarcascade_righteye_2splits.xml 
        嘴部檢測器:haarcascade_mcs_mouth.xml 
        鼻子檢測器:haarcascade_mcs_nose.xml 
        身體檢測器:haarcascade_fullbody.xml 
        人臉檢測器(快速LBP):lbpcascade_frontalface.xml
原文鏈接:https://blog.csdn.net/qq_42633819/article/details/81191308  """

""" 功能:cv2.VideoCapture是使用攝像頭的方法,
         可以有多個攝像頭,多以攝像頭的編號是從0開始
參數列表: VideoCapture第一個參數就是攝像頭編號"""
cap = cv2.VideoCapture(0)

"""功能:進入人臉檢測,因爲處理的過程是將攝像頭得到的每一幀數據進行處理,並且信息實時更新!"""
while True:

    """功能:讀取解碼攝像頭得到的每幀圖像,第二個返回值是得到的每一幀圖像"""
    ok, img = cap.read()

    """功能從:磁盤讀取一張圖片進行人臉識別標記出來
    參數列表: 圖片路徑
    返回值:  讀取到的文件緩存
    img = cv2.imread(filepath)  # 讀取圖片"""

    """功能:將當前幀轉換成灰度圖像,輸入值是攝像頭得到的每一幀圖像、代表灰度的參數
            灰度圖像是爲了減少增加識別效率,減少識別的運算量,降低計算複雜度"""
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    """功能:利用分類器識別出哪個區域爲人臉
    參數列表:
            image:圖像緩存文件
            scaleFactor圖片縮放比例;
            minNeighbors要檢測的有效點數;
            minNeighbors:對特徵檢測點周邊多少有效點同時檢測,這樣可避免因選取的特徵檢測點太小而導致遺漏,數字越大識別精度越高;
            minSize:特徵檢測點的最小尺寸。
    返回值: 得到一個矩形(一個臉一個)分別是矩形的x, y, w, h(座標,長寬),
            如果是多個臉就有多個矩形,則返回值爲列表,列表內包含每一個矩形的信息"""
    faces = face_cascade.detectMultiScale(image = gray,
                                          scaleFactor = 1.2,# scaleFactor圖片縮放比例
                                          minNeighbors = 4,# minNeighbors要檢測的有效點數,數字越大識別精度越高
                                          minSize = (32, 32) )# 特徵檢測點的最小尺寸

    """功能:將多個臉用框畫出來"""
    if len(faces) > 0: # 大於0則檢測到人臉
        for faceRect in faces: # 單獨框出每一張人臉,
            x, y, w, h = faceRect # 在圖像中人臉的位置和大小信息
            """功能:在圖像中使用方框標記出來人臉"""
            cv2.rectangle(img = img, # 圖像文件
                          pt1 = (x, y), # 方框位置
                          pt2 = (x + w, y + h), # 方框的大小
                          color = (255, 0, 0),# 方框的顏色
                          thickness = 2 ) # 方框的線寬

            """功能:把原來的圖像轉切割成只剩下人臉的小圖像"""
            roi_color = img[y:y + h // 2, x:x + w]
            """功能:把原來的灰度圖像轉切割成只剩下人臉的小灰度圖像"""
            roi_gray = gray[y:y + h // 2, x:x + w]
            """功能:利用利用分類器識別出哪個區域爲眼睛"""
            eyes = eye_cascade.detectMultiScale(image = roi_gray, # 圖像緩存文件
                                                scaleFactor = 1.1, # scaleFactor圖片縮放比例
                                                minNeighbors = 1, # minNeighbors要檢測的有效點數
                                                flags = cv2.CASCADE_SCALE_IMAGE, # 層疊縮放圖像
                                                minSize = (2, 2)) # 特徵檢測點的最小尺寸

            """功能:將多個眼睛圈畫出來"""
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(img = roi_color, # 圖像文件
                              pt1 = (ex, ey), # 方框位置
                              pt2 = (ex + ew, ey + eh), # 方框的大小
                              color = (0, 255, 0), # 方框的顏色
                              thickness = 2) # 方框的線寬

            """功能:在窗口裏輸出文字提示"""
            cv2.putText(img = img, # 圖像文件
                        text = "face", # 要顯示的文字
                        org = (x, y - 30),  # 座標
                        fontFace = cv2.FONT_HERSHEY_SIMPLEX,  # 字體
                        fontScale = 1,  # 字號
                        color = (255, 0, 255),  # 顏色
                        lineType = 2)  # 字的線寬

    """功能:等待10毫秒看是否有按鍵輸入"""
    cv2.imshow(winname = "img", mat = img)
    """功能:如果輸入q則退出循環"""
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

"""   
# 將當前幀保存爲圖片
ok, frame = cap.read()  # 讀取一幀數據
img_name = '%s/%s.jpg ' %(path_name, name)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image)"""

運行環境:

Ubuntu19.0
python3.7
pycharm

踩坑細節:

本來以爲安裝opencv的庫需要很麻煩,下載了zip還去搜怎麼安裝,結果安裝了半天也沒有安裝上,但是在pycharm直接搜索這個庫就直接安裝好了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章