如果dilb和face_recognition第三方包安裝失敗,請移步到Python 解決dilb和face_recognition第三方包安裝失敗_水w的博客-CSDN博客
上篇請移步到Python+dilb 簡單實(shí)現(xiàn)人臉檢測(附代碼)_水w的博客-CSDN博客
本篇是在上篇的工作基礎(chǔ)上進(jìn)行的。
目錄
6 人臉檢測多個(gè)
7 視頻檢測
8 拍照保存
9 訓(xùn)練數(shù)據(jù)
解決報(bào)錯(cuò)AttributeError: module 'cv2' has no attribute 'face'
10 人臉識別
6 人臉檢測多個(gè)
整個(gè)代碼如下:?
# 導(dǎo)入cv模塊
import cv2 as cv
# 檢測函數(shù)
def face_detect_demo():
gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier(
'D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
face = face_detect.detectMultiScale(gary)
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
cv.imshow('result', img)
# 讀取圖像
img = cv.imread('face2.jpg')
# 檢測函數(shù)
face_detect_demo()
# 等待
while True:
if ord('q') == cv.waitKey(0):
break
# 釋放內(nèi)存
cv.destroyAllWindows()
效果如下:?
可以看到,大部分的人臉都被檢測出來了。在人數(shù)很多的情況下,有一個(gè)沒有被檢測到,但在簡單的場景下還是能基本完成要求的。
當(dāng)然,我們也可以改變調(diào)用的這個(gè)haarcascade_frontalface_alt2.xml文件,換成該路徑下的其他的,比如haarcascade_frontalface_default.xml,效果會(huì)稍有不同。
7 視頻檢測
整個(gè)代碼如下:?
# 導(dǎo)入cv模塊
import cv2 as cv
# 檢測函數(shù)
def face_detect_demo(img):
gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier('D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
face = face_detect.detectMultiScale(gary)
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
cv.imshow('result', img)
# 讀取攝像頭
cap = cv.VideoCapture(0)
# 循環(huán)
while True:
flag, frame = cap.read()
if not flag:
break
face_detect_demo(frame)
if ord('q') == cv.waitKey(1):
break
# 釋放內(nèi)存
cv.destroyAllWindows()
# 釋放攝像頭
cap.release()
此處就不展示效果了。
8 拍照保存
整個(gè)代碼如下:?
# 導(dǎo)入模塊
import cv2
# 攝像頭
cap = cv2.VideoCapture(0)
falg = 1
num = 1
while (cap.isOpened()): # 檢測是否在開啟狀態(tài)
ret_flag, Vshow = cap.read() # 得到每幀圖像
cv2.imshow("Capture_Test", Vshow) # 顯示圖像
k = cv2.waitKey(1) & 0xFF # 按鍵判斷
if k == ord('s'): # 保存
cv2.imwrite("D:/mycodetest/opencv/data/jm/" + str(num) + ".123" + ".jpg", Vshow)
print("success to save" + str(num) + ".jpg")
print("-------------------")
num += 1
elif k == ord(' '): # 退出
break
# 釋放攝像頭
cap.release()
# 釋放內(nèi)存
cv2.destroyAllWindows()
此處就不展示效果了。
9 訓(xùn)練數(shù)據(jù)
整個(gè)代碼如下:?
import os
import cv2
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples = []
ids = []
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
# 檢測人臉
face_detector = cv2.CascadeClassifier(
'D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
# 打印數(shù)組imagePaths
print('數(shù)據(jù)排列:', imagePaths)
# 遍歷列表中的圖片
for imagePath in imagePaths:
# 打開圖片,黑白化
PIL_img = Image.open(imagePath).convert('L')
# 將圖像轉(zhuǎn)換為數(shù)組,以黑白深淺
# PIL_img = cv2.resize(PIL_img, dsize=(400, 400))
img_numpy = np.array(PIL_img, 'uint8')
# 獲取圖片人臉特征
faces = face_detector.detectMultiScale(img_numpy)
# 獲取每張圖片的id和姓名
id = int(os.path.split(imagePath)[1].split('.')[0])
# 預(yù)防無面容照片
for x, y, w, h in faces:
ids.append(id)
facesSamples.append(img_numpy[y:y + h, x:x + w])
# 打印臉部特征和id
# print('fs:', facesSamples)
print('id:', id)
# print('fs:', facesSamples[id])
print('fs:', facesSamples)
# print('臉部例子:',facesSamples[0])
# print('身份信息:',ids[0])
return facesSamples, ids
if __name__ == '__main__':
# 圖片路徑
path = './data/jm/'
# 獲取圖像數(shù)組和id標(biāo)簽數(shù)組和姓名
faces, ids = getImageAndLabels(path)
# 獲取訓(xùn)練對象
recognizer = cv2.face.LBPHFaceRecognizer_create()
# recognizer.train(faces,names)#np.array(ids)
recognizer.train(faces, np.array(ids))
# 保存文件
recognizer.write('trainer/trainer.yml')
# save_to_file('names.txt',names)
效果如下: 會(huì)生成一個(gè)文件,文件的路徑為trainer/trainer.yml。
解決報(bào)錯(cuò)AttributeError: module 'cv2' has no attribute 'face'
場景:在使用cv2.face.LBPHFaceRecognizer_create()進(jìn)行人臉識別的操作時(shí),會(huì)出現(xiàn)這樣的提示。
recognizer = cv2.face.LBPHFaceRecognizer_create()
解決方法:之所以出現(xiàn)這種情況,是因?yàn)?strong>缺少了相關(guān)的包。
從官網(wǎng)上我們看到,face模塊實(shí)際上并不是opencv圖書館的一部分。更確切地說,face是部分的的opencv-contrib庫。從自述文件:此存儲(chǔ)庫[ opencv-contrib]用于開發(fā)所謂的“額外”模塊,提供功能。新模塊通常沒有穩(wěn)定的API,并且它們沒有經(jīng)過良好測試。因此,它們不應(yīng)作為官方OpenCV發(fā)行版的一部分發(fā)布,因?yàn)樵搸毂3侄M(jìn)制兼容性,并試圖提供良好的性能和穩(wěn)定性。
(1)首先切換到你所在的環(huán)境(不建議在base環(huán)境中直接下載),接著就是下載我們需要的相關(guān)的包,用清華源下載快。
在pycharm的終端中,執(zhí)行下條命令,
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python
安裝成功,看到successfully之后就可以重新運(yùn)行代碼了。
ok,問題解決。
10 人臉識別
整個(gè)代碼如下:?
import cv2, os
import numpy as np
# coding=utf-8
import urllib
import urllib.request
import hashlib
# 加載訓(xùn)練數(shù)據(jù)集文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
names = []
warningtime = 0
def md5(str):
import hashlib
m = hashlib.md5()
m.update(str.encode("utf8"))
return m.hexdigest()
statusStr = {
'0': '短信發(fā)送成功',
'-1': '參數(shù)不全',
'-2': '服務(wù)器空間不支持,請確認(rèn)支持curl或者fsocket,聯(lián)系您的空間商解決或者更換空間',
'30': '密碼錯(cuò)誤',
'40': '賬號不存在',
'41': '余額不足',
'42': '賬戶已過期',
'43': 'IP地址限制',
'50': '內(nèi)容含有敏感詞'
}
def warning():
smsapi = "http://api.smsbao.com/"
# 短信平臺賬號
user = '13******10'
# 短信平臺密碼
password = md5('*******')
# 要發(fā)送的短信內(nèi)容
content = '【報(bào)警】\n原因:檢測到未知人員\n地點(diǎn):xxx'
# 要發(fā)送短信的手機(jī)號碼
phone = '*******'
data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content})
send_url = smsapi + 'sms?' + data
response = urllib.request.urlopen(send_url)
the_page = response.read().decode('utf-8')
print(statusStr[the_page])
# 準(zhǔn)備識別的圖片
def face_detect_demo(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉(zhuǎn)換為灰度
face_detector = cv2.CascadeClassifier('D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
face = face_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))
# face=face_detector.detectMultiScale(gray)
for x, y, w, h in face:
cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=1)
# 人臉識別
ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
# print('標(biāo)簽id:',ids,'置信評分:', confidence)
if confidence > 80:
global warningtime
warningtime += 1
if warningtime > 100:
warning()
warningtime = 0
cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
else:
cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
cv2.imshow('result', img)
# print('bug:',ids)
def name():
path = './data/jm/'
# names = []
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
for imagePath in imagePaths:
name = str(os.path.split(imagePath)[1].split('.', 2)[1])
names.append(name)
cap = cv2.VideoCapture('1.mp4')
name()
while True:
flag, frame = cap.read()
if not flag:
break
face_detect_demo(frame)
if ord(' ') == cv2.waitKey(10):
break
cv2.destroyAllWindows()
cap.release()
# print(names)
如果大家想要使用代碼中提到的報(bào)警功能,首先需要先去馬上使用更好的短信服務(wù)-短信寶官網(wǎng)這個(gè)網(wǎng)站去注冊登錄,才有賬號。
此處由于我代碼里寫的賬號信息不對,因此pycharm終端輸出的是“密碼錯(cuò)誤”,正常情況下會(huì)顯示發(fā)生短信成功。
效果如下:?
?
文章來源:http://www.zghlxwxcb.cn/news/detail-793303.html
由于我們數(shù)據(jù)訓(xùn)練只加入了路徑為./data/jm/1.lena.jpg一張圖片,因此當(dāng)執(zhí)行代碼建人臉識別時(shí),它只能識別出這個(gè)叫l(wèi)ena的女孩,其他人臉識別出來都是會(huì)標(biāo)注為“unknow”。文章來源地址http://www.zghlxwxcb.cn/news/detail-793303.html
到了這里,關(guān)于Python+OpenCV 簡單實(shí)現(xiàn)人臉檢測多個(gè)和人臉識別 2(附代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!