天天看點

Python-opencv:人臉識别系統(一)----調用攝像頭儲存人臉前言一,開發環境和包介紹二,調用攝像頭三,導入OpenCV自帶人臉識别器識别人臉四,儲存到本地下部分預告

人臉識别系統(一)

  • 前言
  • 一,開發環境和包介紹
  • 二,調用攝像頭
  • 三,導入OpenCV自帶人臉識别器識别人臉
  • 四,儲存到本地
    • 1,自動建立路徑
    • 2,加上儲存的代碼
  • 下部分預告

前言

為了激勵自己完整的寫程式,也為了儲存代碼,也為了分享知識。。。總之,我決定在CSDN上寫寫自己作為一個菜雞的寫程式過程,以避免工作後問寫過啥東西之後無話可說。

正好學期末學校找企業的老師來帶我們做課設,這次使用python開發人臉識别系統,雖然課設很水,就是較了怎末調用人臉識别接口,但是我還是想把這個東西擴充一下做出個有點用的東西出來。

在此記錄一下吧,給位看官有問題歡迎留言指導或詢問。大佬們看見問題懇請指導一下,誰都是從菜鳥過來的,多多感謝。

一,開發環境和包介紹

系統 Windows10
python版本 python3.7
IDE環境 pycharm2019
依賴包 numpy()
核心依賴包 opencv-python,opencv-contrib-python
注1 這倆包有啥具體的差別我也不知道。。知道的小夥伴麻煩指導下吧。

使用anaconda虛拟環境的可能在anaconda裡找不到的,直接pip安裝即可。

注意事項
opencv安裝包有很多但是不要都裝!全安裝上反而會沖突
有調用opencv包出錯的情況可以試試重安裝下試試

二,調用攝像頭

不BB,上代碼運作試試。

import cv2 #調用opencv

cap = cv2.VideoCapture(0) #打開攝像頭,0為自帶攝像頭,外設用1,2...試試

while(True):
    ret, frame = cap.read()#獲得圖像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#轉化為灰階
    cv2.imshow('Frame', frame)#顯示
    k = cv2.waitKey(30) #設定視訊重新整理頻率,機關為毫秒,傳回值為鍵盤按鍵的值
    if k == 27:#如果摁下esc則退出
        break

cap.release()#關閉攝像頭
cv2.destroyAllWindows()#銷毀全部窗體
           

運作結果:

Python-opencv:人臉識别系統(一)----調用攝像頭儲存人臉前言一,開發環境和包介紹二,調用攝像頭三,導入OpenCV自帶人臉識别器識别人臉四,儲存到本地下部分預告

三,導入OpenCV自帶人臉識别器識别人臉

這裡主要是調用人臉識别分類器 haarcascade_frontalface_default.xml

找不到的打開我的電腦搜尋檔案。

一般就放在自己的包環境裡

實在沒的:百度網盤提取碼:wf7r

放在.py同級目錄下

import cv2

cap = cv2.VideoCapture(0)#打開攝像頭
# 人臉識别分類器
faceCascade = cv2.CascadeClassifier(r'E:\ANACONDA\envs\FaceRecognition\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')

while(True):
    ret, frame = cap.read()#獲得圖像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#轉化為灰階
    faces = faceCascade.detectMultiScale(  # 人臉檢測
        gray,#灰階圖,使用灰階圖會提高效率
        scaleFactor=1.05,#圖檔縮小的值
        minNeighbors=10,#判斷次數
        minSize=(16, 16)#人臉最小尺寸
    )
    for (x, y, w, h) in faces:#faces中時一個圖檔中所有識别出來的人臉,有可能時多個
        #畫臉的方框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)#圖像源,原點,終點,線的顔色,粗細

    cv2.imshow('Frame', frame) #顯示
    k = cv2.waitKey(30) #設定視訊重新整理頻率,機關為毫秒,傳回值為鍵盤按鍵的值
    if k == 27:
        break

cap.release()#關閉攝像頭
cv2.destroyAllWindows()#銷毀全部窗體
           

運作結果:

Python-opencv:人臉識别系統(一)----調用攝像頭儲存人臉前言一,開發環境和包介紹二,調用攝像頭三,導入OpenCV自帶人臉識别器識别人臉四,儲存到本地下部分預告

四,儲存到本地

1,自動建立路徑

儲存到本地要現有個儲存路徑,總是自己打開檔案夾建立好煩的,先實作自動建立路徑

#建立目錄代碼
def mkdir(path):
    import os  # 引入子產品
    path = path.strip()# 去除首位空格
    path = path.rstrip("\\") # 去除尾部 \ 符号

    isExists = os.path.exists(path) # 判斷路徑是否存在.存在 True ,不存在  False
    # 判斷結果
    if not isExists:# 如果不存在則建立目錄
        os.makedirs(path) # 建立目錄操作函數
        print(path + ' 路徑建立成功')
        return True
    else: # 如果目錄存在則不建立,并提示目錄已存在
        print(path + ' 目錄已存在')
        fileNum=len([lists for lists in os.listdir(path)])#獲得該路徑下檔案數量
        return fileNum  #傳回路徑下檔案數量
           

2,加上儲存的代碼

import cv2
import tools

cap = cv2.VideoCapture(0)#打開攝像頭
# cap.set(3, 640)
# cap.set(4, 480)

# 人臉識别分類器
faceCascade = cv2.CascadeClassifier(r'E:\ANACONDA\envs\FaceRecognition\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')

face_id=int(input("你的編号"))
path="./MyFaces/"+str(face_id)# 儲存路徑
count=tools.mkdir(path)# 目前已有圖像個數
ObjectNum=count+1000# 目标儲存個數
while(True):
    ret, frame = cap.read()#獲得圖像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#轉化為灰階圖

    faces = faceCascade.detectMultiScale(  # 人臉檢測
        gray,#灰階圖,使用灰階圖會提高效率
        scaleFactor=1.05,#圖檔縮小的值
        minNeighbors=10,#判斷次數
        minSize=(16, 16)#人臉最小尺寸
    )

    for (x, y, w, h) in faces:#faces中時一個圖檔中所有識别出來的人臉,有可能時多個
        #畫臉的方框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)#圖像源,原點,終點,線的顔色,粗細
        count+=1#個數加一
        fac_gray = gray[y: (y + h), x: (x + w)]#擷取臉部圖檔
        cv2.imwrite(path+'/' + str(face_id) + '.' + str(count) + '.jpg', fac_gray) # 儲存圖像
        break #隻取一個,取完就退。


    cv2.imshow('Frame', frame)#顯示
    k = cv2.waitKey(30) #設定視訊重新整理頻率,機關為毫秒,傳回值為鍵盤按鍵的值
    if k == 27:#如果摁下esc鍵則退出
        break
    elif count>=ObjectNum:#收集的數量足夠則退出
        break

cap.release()#關閉攝像頭
cv2.destroyAllWindows()#銷毀全部窗體
           

運作結果:

Python-opencv:人臉識别系統(一)----調用攝像頭儲存人臉前言一,開發環境和包介紹二,調用攝像頭三,導入OpenCV自帶人臉識别器識别人臉四,儲存到本地下部分預告

這裡我存了一千張,建議一次存一百張就行,效果差距不大,一千張太慢了。

下部分預告

至此,就完成了簡單的人臉識别和錄入功能,但是還無法識别出來誰是誰,下次完成人臉識别系統的訓練和識别子產品。

更新後将添加下部分連結:先睡覺。