目錄
一:dlib庫踩的坑
Import dlib報錯:
可是已經安裝了dlib庫:
嘗試卸載在安裝:
conda uninstall dlib命令失敗:
改用pip uninstall dlib命令成功卸載:
重新安裝:pip install dlib失敗,報錯,又試了幾遍還是同樣的錯:
后來嘗試:從 https://pypi.org/ 將dlib庫下載到本地安裝如下圖,安裝成功:
然而任然不能import:
經查,說是py36沒有dlib庫的穩定版本,一般裝19.6.1就可以用,結果也報錯:
將dlib-19.6.1版本的whl文件下載到本地安裝,安裝成功,import可行:
二:OpenCV庫踩得坑:
報錯截圖:
提示代碼:
success, img = camera.read()
#灰度化
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
后來得知:除了路徑問題還有可能是攝像頭ID沒對!
打開攝像頭代碼如下:
camera = cv2.VideoCapture(0)
success,frame = camera.read()
這兩行:
1、cap = cv2.VideoCapture(0)
VideoCapture()中參數是0,表示打開筆記本的內置攝像頭,其他數字則代表其他設備;參數是視頻文件路徑則打開視頻,如cap = cv2.VideoCapture(“../demo.mp4”)
2、ret,frame = cap.read()
cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結尾,它的返回值就為False。frame就是每一幀的圖像,是個三維矩陣。
注:默認攝像頭索引號為0,可是如果外接USB攝像頭,它的索引號就不一定是0 ;另外,像我的筆記本自帶攝像頭索引傳0一直報錯,所以我先暴力破解一下攝像頭的索引號,確認一下到底是不是0!代碼如下:
import cv2
ID = 0
while(1):
camera = cv2.VideoCapture(ID)
success,frame = camera.read()
if success==False:
ID += 1
else:
print(ID)
break
打印的結果是700!!
將原來代碼里的索引號替換后果然OK!
importcv2
ID=700
camera=cv2.VideoCapture(ID)
while(1):
success,frame=camera.read()
cv2.imshow("hello",frame)
if cv2.waitKey(1)&0xFF==ord('q'):
break
camera.release()
cv2.destroyAllWindows()
攝像頭的索引號改成了700,代碼能打開攝像頭了,但是窗口一片漆黑!如下:
——重啟解決了問題,不過此后又出現了這個情況,后來才發現是我在某軟件中設置了關於攝像頭的安全規則——不允許非法打開攝像頭,我先扶牆緩緩。
代碼如下:
"""
通過攝像頭檢測並標記人臉
"""
import cv2
# 加載人臉特征庫
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 加載人眼特征庫
eye_engine = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
# 打開攝像頭,700是攝像頭索引號(0表示默認攝像頭)
camera = cv2.VideoCapture(700)
while(True):
# 讀取一幀的圖像
success, img = camera.read()
# 灰度化
# img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 檢測人臉:1.3是放大比例(此參數必須大於1);13是重復識別次數(此參數用來調整精確度,越大則越精確)
faces = face_engine.detectMultiScale(img, scaleFactor=1.3, minNeighbors=13)
# 對每一張臉,進行以下操作
for (x, y, w, h) in faces:
# 用矩形框出人臉:BGR色彩體系;2表示畫筆寬度
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 用矩形圈出人臉
# 記錄下臉部位置,作為識別眼睛的區域范圍
face_area = img[y:y + h, x:x + w]
# 在記錄下的臉部區域識別人眼
eyes = eye_engine.detectMultiScale(face_area)
# 對每一個識別出的人眼,進行以下操作
for (xe, ye, we, he) in eyes:
cv2.rectangle(face_area, (xe, ye), (xe + we, ye + he), (0, 255, 0), 1)
cv2.imshow('Face Recognition', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 關閉攝像頭
camera.release()
# 關閉所有窗口
cv2.destroyAllWindows()
三:實現人臉識別
項目詳見GitHub地址。具體功能:支持從照片、視頻文件、攝像頭獲取人臉數據;支持自己訓練模型;支持識別照片、視頻文件、攝像頭中的人臉。
GitHub:https://github.com/Pan-will/CNN_FacesRecognition.git
項目環境:詳見requirements.txt文件;
項目結構如圖:
注:
1. dataset文件夾是數據集;
2. MyModel文件夾存放訓練的模型問價;
3. model_test文件夾是測試模型時,存放待測照片、視頻所用;
4. my_faces 和 MySource_faces文件夾是測試采集人臉數據集時所用的。
5. 采集人臉數據集:
從照片采集:faces_from_Photo.py
從視頻文件采集:faces_from_Video.py
從攝像頭采集:faces_from_Camera.py
加載照片的函數:read_img.py
6. 處理照片並加載標簽:load_dataset.py
7. 構建並訓練模型:train_model.py
處理數據集的函數:dataSet.py
8. 模型測試
識別照片中的人臉:Recognize_From_Photo.py、Recognize_From_Photo(2).py
識別視頻文件中的人臉:Recognize_From_Vedio.py
識別攝像頭中的人臉:Recognize_From_Camera.py