python+opencv人臉識別(人臉檢測,存儲人臉數據)解釋超詳細適合初學者

import sys

import cv2


def CatchPICFromVideo(path_name, window_name="GET_FACE", camera_idx=0, catch_pic_num=500):
    cv2.namedWindow(window_name)

    # 視頻來源,可以來自一段已存好的視頻,也可以直接來自USB攝像頭
    cap = cv2.VideoCapture(camera_idx)#cap = cv2.VideoCapture(0)是打開本地攝像頭

    #打開本地視頻
    #cap =cv2.VideoCapture("/home/dong/Pictures/QQ視頻20190417160108.mp4")

    # 告訴OpenCV使用人臉識別分類器
    classfier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

    # 識別出人臉後要畫的邊框的顏色,RGB格式
    color = (0, 255, 0)

    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 讀取一幀數據
        print(type(frame))
        if not ok:
            break

        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 將當前楨圖像轉換成灰度圖像

        # 人臉檢測,1.2和2分別爲圖片縮放比例和需要檢測的有效點數
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=10, minSize=(32, 32))
        '''
1 grey 是輸入圖像
2 scaleFactor這個是每次縮小圖像的比例,默認是1.1 ,我這裏選用1.2
3 minNeighbors 它表明如果有15個框都重疊一起了,那這裏肯定是臉部
我以前是 minNeighbors=3容易判斷錯誤,有些不是臉部也給標記起來了,在我看來,minNeighbors可以提高精度。
4 minSize() 匹配物體的最小範圍
maxSize()匹配物體的最大範圍
5  flags=0:可以取如下這些值:
CASCADE_DO_CANNY_PRUNING=1, 利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區域
CASCADE_SCALE_IMAGE=2, 正常比例檢測
CASCADE_FIND_BIGGEST_OBJECT=4, 只檢測最大的物體

        '''
        if len(faceRects) > 0:  # 大於0則檢測到人臉
            for faceRect in faceRects:  # 單獨框出每一張人臉
                x, y, w, h = faceRect

                # 將當前幀保存爲圖片
                img_name = '%s/%d.jpg ' % (path_name, num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image)

                num += 1
                if num > (catch_pic_num):  # 如果超過指定最大保存數量退出循環
                    break

                # 畫出矩形框
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)

                # 顯示當前捕捉到了多少人臉圖片了,這樣站在那裏被拍攝時心裏有個數,不用兩眼一抹黑傻等着
                font = cv2.FONT_HERSHEY_SIMPLEX
                cv2.putText(frame, 'num:%d' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)

                # 超過指定最大保存數量結束程序
        if num > (catch_pic_num): break

        # 顯示圖像
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(10)
        #waitKey()函數的功能是不斷刷新圖像,頻率時間爲delay,單位爲ms。
        if c & 0xFF == ord('q'):
            break

            # 釋放攝像頭並銷燬所有窗口
    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    #CatchPICFromVideo("識別人臉區域")
    CatchPICFromVideo('E:\\work\\facode\\renlian-master\\data\\su')
#def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
#在函數定義中,幾個參數,反別是窗口名字,攝像頭系列號,捕捉照片數量,以及存儲路徑

在下邊的人臉識別分類器中是我自己下載的opencv,下載網站是:https://opencv.org/releases.html,你也要找到這個路徑並且複製到程序中,這個東西的作用主要是實現對人臉識別的功能,在安裝中還有其他的功能,我也一併列在下面:

               人臉檢測器(默認):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

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