基于Python實(shí)現(xiàn)人臉識(shí)別和焦點(diǎn)人物檢測(cè)功能
寫在前面的話
基于dlib庫的模型,實(shí)現(xiàn)人臉識(shí)別和焦點(diǎn)人物的檢測(cè)。最后呈現(xiàn)的效果為焦點(diǎn)人物的識(shí)別框顏色與其他人物框不一樣。
準(zhǔn)備工作
需要安裝好python環(huán)境,安裝好dlib、opencv-python庫等,具體可以看報(bào)錯(cuò)信息(可以使用PyCharm來運(yùn)行和編輯py文件),然后把需要的庫補(bǔ)全,文章最后會(huì)有完整代碼,但是需要與shape_predictor_68_face_landmarks.dat模型文件同處一個(gè)路徑下,然后啟用。(百度可以下載到)
設(shè)計(jì)過程
- 因?yàn)槭窃谧约弘娔X完成的必做題設(shè)計(jì),所以前期還經(jīng)歷了相應(yīng)的Python安裝與環(huán)境配置,相應(yīng)的資源庫安裝,例如dlib、opencv-python等等。
- 然后運(yùn)行綜合了(68個(gè)人臉特征點(diǎn)檢測(cè)模型完成靜止圖像的人臉檢測(cè)與標(biāo)注)和(完成實(shí)時(shí)攝制視頻的人臉檢測(cè)與定位)的參考文件opencv_webcam_face_detection.py,發(fā)現(xiàn)可以實(shí)現(xiàn)實(shí)時(shí)視頻的人臉檢測(cè)。
- 對(duì)參考文件的代碼進(jìn)行分析,理解每一句代碼的意思。對(duì)比查找設(shè)計(jì)需要的功能模塊,實(shí)現(xiàn)1280x720視頻輸出,實(shí)現(xiàn)類win10相機(jī)的焦點(diǎn)人物識(shí)別。
- 上網(wǎng)查找并學(xué)習(xí)相應(yīng)資料,參考win10相機(jī)的算法,創(chuàng)建自己的基于距離與面積的焦點(diǎn)人物算法,根據(jù)自己的需要對(duì)源代碼進(jìn)行添加及修改。
- 最后對(duì)代碼進(jìn)行測(cè)試,且不斷修改成最適合的版本。
Python程序
流程圖

焦點(diǎn)人物算法
內(nèi)在邏輯:模仿win10相機(jī),當(dāng)有多于1個(gè)人時(shí),優(yōu)先選擇最居中的為焦點(diǎn)人物,但若在其他地方的人臉面積大于4倍中心的人臉面積,則選擇其他地方的作為焦點(diǎn)人物。
實(shí)際代碼
import dlib
import cv2
import math
# 攝像頭參數(shù)設(shè)置
cam = cv2.VideoCapture(0) # 參數(shù)0,調(diào)用計(jì)算機(jī)的攝像頭
cam.set(3, 1280) # 參數(shù)3,設(shè)定寬度分辨為1280
cam.set(4, 720) # 參數(shù)4,設(shè)定高度分辨為720
# 設(shè)定人臉框的邊框顏色及寬度,便于分辨焦點(diǎn)人物
color_focus = (255, 0, 255) # 設(shè)定焦點(diǎn)人臉框的顏色,紫紅色
color_other = (255, 255, 255) # 設(shè)定其余人臉框的顏色,白色
lineWidth_focus = 2 # 設(shè)定焦點(diǎn)人臉框的寬度
lineWidth_other = 1 # 設(shè)定其他人臉框的寬度
# 設(shè)定計(jì)算的一些參數(shù)
w = cam.get(3) / 2 # 設(shè)定屏幕中心的橫坐標(biāo)X
h = cam.get(4) / 2 # 設(shè)定屏幕中心的縱坐標(biāo)Y
d_center = 10000 # 預(yù)設(shè)人臉框到屏幕中心的距離
index_center = 0 # 預(yù)設(shè)距離優(yōu)先時(shí)的人臉框序號(hào)
index_area = 0 # 預(yù)設(shè)面積優(yōu)先時(shí)的人臉框序號(hào)
area_center = -1 # 預(yù)設(shè)距離中心最近人臉框的面積
area = -1 # # 預(yù)設(shè)人臉框面積最大時(shí)的面積
detector = dlib.get_frontal_face_detector() # 加載這個(gè)庫自帶的人臉檢測(cè)器
predictor_path = "shape_predictor_68_face_landmarks.dat" # 設(shè)置人臉預(yù)測(cè)模型的路徑位置
predictor = dlib.shape_predictor(predictor_path) # 人臉預(yù)測(cè)實(shí)例化
while True: # 當(dāng)獲取到視頻輸入時(shí)
ret_val, img = cam.read() # 讀取視頻每一幀,顏色格式為BGR格式,
rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 顏色BGR格式轉(zhuǎn)為RGB格式
faces = detector(rgb_image) # 返回RGB格式人臉捕捉框
# 邏輯算法:當(dāng)有多于1個(gè)人時(shí),優(yōu)先選擇最居中的為焦點(diǎn)人物,但若其他地方的人臉面積大于4倍中心的人臉面積,則選擇該為焦點(diǎn)人物。
# 這個(gè)for循環(huán)先求出距離屏幕中心最近時(shí)的人臉框的序號(hào)和距離優(yōu)先面積
for i, det in enumerate(faces): # 遍歷所有人臉框,i是人臉框序號(hào),det是每個(gè)人臉框
d = math.sqrt((w-(det.left()+(det.right()-det.left())/2))**2+(h-(det.top()+(det.bottom()-det.top())/2))**2)
# 計(jì)算該人臉框到屏幕中心的距離
if d < d_center: # 對(duì)比剛計(jì)算出的距離與設(shè)定的最近距離,達(dá)成選擇更小
index_center = i # 更新距離最近時(shí)的人臉框序號(hào)
d_center = d # 更新最近距離
area_center = abs((det.right() - det.left()) * (det.bottom() - det.top())) # 算出該人臉框的面積(距離更近優(yōu)先)
# 這個(gè)for循環(huán)求出面積最大的人臉框的序號(hào)和面積優(yōu)先面積
for i, det in enumerate(faces): # 遍歷所有人臉框,i是人臉框序號(hào),det是每個(gè)人臉框
if abs((det.right() - det.left()) * (det.bottom() - det.top())) > area: # 對(duì)比該人臉面積與設(shè)定的最大面積,實(shí)現(xiàn)選擇更大
index_area = i # 更新面積更大時(shí)的人臉框序號(hào)
area = abs((det.right() - det.left()) * (det.bottom() - det.top())) # 算出該人臉框的面積(面積更大優(yōu)先)
if area > 5*area_center: # 判斷依據(jù),若面積優(yōu)先面積大于距離優(yōu)先面積的5倍,就實(shí)現(xiàn)面積優(yōu)先選擇焦點(diǎn)人物,否則就距離優(yōu)先。
index_center = index_area # 面積優(yōu)先時(shí),使用面積最大的人臉框序號(hào)
for i, det in enumerate(faces): # 遍歷所有人臉框
if i == index_center: # 確定焦點(diǎn)人臉框的序號(hào)
print(d_center, i) # 輸出焦點(diǎn)人物的距離中心位置,方便調(diào)試
cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_focus, lineWidth_focus)
# 繪出焦點(diǎn)人臉框
shape = predictor(img, det) # 從預(yù)測(cè)模型處,得到68個(gè)人物特征點(diǎn)
for p in shape.parts(): # 遍歷68個(gè)人物特征點(diǎn)
cv2.circle(img, (p.x, p.y), 2, (124, 252, 0), -1) # 設(shè)定焦點(diǎn)人物的68個(gè)點(diǎn)的形狀顏色,茶綠色、實(shí)心
else:
cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_other, lineWidth_other)
# 繪出其他人臉框
shape = predictor(img, det) # 從預(yù)測(cè)模型處,得到68個(gè)人物特征點(diǎn)
for p in shape.parts(): # 遍歷68個(gè)人物特征點(diǎn)
cv2.circle(img, (p.x, p.y), 2, (255, 255, 255), -1) # 設(shè)定其他人物的68個(gè)點(diǎn)的形狀顏色,白色、實(shí)心
cv2.imshow('my webcam', img) # 輸出繪好框后的幀動(dòng)畫
if cv2.waitKey(1) == 27: # 設(shè)置一個(gè)滯留時(shí)間,等待用戶觸發(fā)事件,若用戶按下 ESC(ASCII碼為27),則執(zhí)行 if 體
break # (if主體)退出
cv2.destroyAllWindows() # 銷毀所有輸出圖像窗
運(yùn)行情況
為了容易分辨焦點(diǎn)人物與其他人物,首先將焦點(diǎn)人物框的寬度設(shè)為2,顏色設(shè)為紫紅色,68個(gè)識(shí)別點(diǎn)設(shè)為茶綠色;其他人物框的寬度設(shè)為1,顏色設(shè)為白色,68個(gè)識(shí)別點(diǎn)設(shè)為白色。
然后進(jìn)行多次測(cè)試,通過整理測(cè)試結(jié)果,發(fā)現(xiàn)算法沒有錯(cuò)誤,焦點(diǎn)人物按照距離和面積兩個(gè)因素來決定。成功運(yùn)行圖如下:
不展示圖了,但是主人物為紫紅框,其他人物為白色圈。與預(yù)期一致。
到此這篇關(guān)于基于Python的人臉識(shí)別和焦點(diǎn)人物檢測(cè)的文章就介紹到這了,更多相關(guān)Python人臉識(shí)別和焦點(diǎn)人物檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于Python實(shí)現(xiàn)簡單的人臉識(shí)別系統(tǒng)
- Python實(shí)現(xiàn)人臉識(shí)別
- 基于Python搭建人臉識(shí)別考勤系統(tǒng)
- 使用Python實(shí)現(xiàn)簡單的人臉識(shí)別功能(附源碼)
- Python基于pyopencv人臉識(shí)別并繪制GUI界面
- Python人臉識(shí)別之微笑檢測(cè)
- Python摸魚神器之利用樹莓派opencv人臉識(shí)別自動(dòng)控制電腦顯示桌面
- 教你如何用Python實(shí)現(xiàn)人臉識(shí)別(含源代碼)
- Python 幾行代碼即可實(shí)現(xiàn)人臉識(shí)別
相關(guān)文章
Python3實(shí)現(xiàn)發(fā)送QQ郵件功能(文本)
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)發(fā)送QQ郵件功能,文本方面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法
aiohttp?模塊是一個(gè)基于?asyncio?的?HTTP?客戶端和服務(wù)器框架,可以用于異步處理?HTTP?請(qǐng)求和響應(yīng),這篇文章給大家介紹Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法,感興趣的朋友一起看看吧2024-03-03
關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧總結(jié)
雙精度浮點(diǎn)數(shù)(double)是計(jì)算機(jī)使用的一種數(shù)據(jù)類型,使用 64 位(8字節(jié)) 來存儲(chǔ)一個(gè)浮點(diǎn)數(shù)。下面這篇文章主要給大家總結(jié)介紹了關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
Python3解釋器知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容中小編給大家總結(jié)了關(guān)于Python3解釋器的用法以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-02-02
Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能示例
這篇文章主要介紹了Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能,結(jié)合實(shí)例形式分析了Python通過socket模塊實(shí)現(xiàn)TCP連接的客戶端與服務(wù)器端模擬聊天機(jī)器人功能相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
Python+OpenCV圖像處理——實(shí)現(xiàn)輪廓發(fā)現(xiàn)
這篇文章主要介紹了Python+OpenCV實(shí)現(xiàn)輪廓發(fā)現(xiàn),幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-10-10

