人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

基于Python實現(xiàn)人臉識別和焦點人物檢測功能

發(fā)布日期:2021-12-24 19:13 | 文章來源:站長之家

寫在前面的話

基于dlib庫的模型,實現(xiàn)人臉識別和焦點人物的檢測。最后呈現(xiàn)的效果為焦點人物的識別框顏色與其他人物框不一樣。

準(zhǔn)備工作

需要安裝好python環(huán)境,安裝好dlib、opencv-python庫等,具體可以看報錯信息(可以使用PyCharm來運行和編輯py文件),然后把需要的庫補全,文章最后會有完整代碼,但是需要與shape_predictor_68_face_landmarks.dat模型文件同處一個路徑下,然后啟用。(百度可以下載到)

設(shè)計過程

  • 因為是在自己電腦完成的必做題設(shè)計,所以前期還經(jīng)歷了相應(yīng)的Python安裝與環(huán)境配置,相應(yīng)的資源庫安裝,例如dlib、opencv-python等等。
  • 然后運行綜合了(68個人臉特征點檢測模型完成靜止圖像的人臉檢測與標(biāo)注)和(完成實時攝制視頻的人臉檢測與定位)的參考文件opencv_webcam_face_detection.py,發(fā)現(xiàn)可以實現(xiàn)實時視頻的人臉檢測。
  • 對參考文件的代碼進行分析,理解每一句代碼的意思。對比查找設(shè)計需要的功能模塊,實現(xiàn)1280x720視頻輸出,實現(xiàn)類win10相機的焦點人物識別。
  • 上網(wǎng)查找并學(xué)習(xí)相應(yīng)資料,參考win10相機的算法,創(chuàng)建自己的基于距離與面積的焦點人物算法,根據(jù)自己的需要對源代碼進行添加及修改。
  • 最后對代碼進行測試,且不斷修改成最適合的版本。

Python程序

流程圖

焦點人物算法

內(nèi)在邏輯:模仿win10相機,當(dāng)有多于1個人時,優(yōu)先選擇最居中的為焦點人物,但若在其他地方的人臉面積大于4倍中心的人臉面積,則選擇其他地方的作為焦點人物。

實際代碼

import dlib
import cv2
import math
# 攝像頭參數(shù)設(shè)置
cam = cv2.VideoCapture(0)  # 參數(shù)0,調(diào)用計算機的攝像頭
cam.set(3, 1280)  # 參數(shù)3,設(shè)定寬度分辨為1280
cam.set(4, 720)  # 參數(shù)4,設(shè)定高度分辨為720
# 設(shè)定人臉框的邊框顏色及寬度,便于分辨焦點人物
color_focus = (255, 0, 255)  # 設(shè)定焦點人臉框的顏色,紫紅色
color_other = (255, 255, 255)  # 設(shè)定其余人臉框的顏色,白色
lineWidth_focus = 2  # 設(shè)定焦點人臉框的寬度
lineWidth_other = 1  # 設(shè)定其他人臉框的寬度
# 設(shè)定計算的一些參數(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)先時的人臉框序號
index_area = 0  # 預(yù)設(shè)面積優(yōu)先時的人臉框序號
area_center = -1  # 預(yù)設(shè)距離中心最近人臉框的面積
area = -1  # # 預(yù)設(shè)人臉框面積最大時的面積
detector = dlib.get_frontal_face_detector()  # 加載這個庫自帶的人臉檢測器
predictor_path = "shape_predictor_68_face_landmarks.dat"  # 設(shè)置人臉預(yù)測模型的路徑位置
predictor = dlib.shape_predictor(predictor_path)  # 人臉預(yù)測實例化
while True:  # 當(dāng)獲取到視頻輸入時
 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個人時,優(yōu)先選擇最居中的為焦點人物,但若其他地方的人臉面積大于4倍中心的人臉面積,則選擇該為焦點人物。
 # 這個for循環(huán)先求出距離屏幕中心最近時的人臉框的序號和距離優(yōu)先面積
 for i, det in enumerate(faces):  # 遍歷所有人臉框,i是人臉框序號,det是每個人臉框
  d = math.sqrt((w-(det.left()+(det.right()-det.left())/2))**2+(h-(det.top()+(det.bottom()-det.top())/2))**2)
  # 計算該人臉框到屏幕中心的距離
  if d < d_center:  # 對比剛計算出的距離與設(shè)定的最近距離,達成選擇更小
index_center = i  # 更新距離最近時的人臉框序號
d_center = d  # 更新最近距離
area_center = abs((det.right() - det.left()) * (det.bottom() - det.top()))  # 算出該人臉框的面積(距離更近優(yōu)先)
 # 這個for循環(huán)求出面積最大的人臉框的序號和面積優(yōu)先面積
 for i, det in enumerate(faces):  # 遍歷所有人臉框,i是人臉框序號,det是每個人臉框
  if abs((det.right() - det.left()) * (det.bottom() - det.top())) > area:  # 對比該人臉面積與設(shè)定的最大面積,實現(xiàn)選擇更大
index_area = i  # 更新面積更大時的人臉框序號
area = abs((det.right() - det.left()) * (det.bottom() - det.top()))  # 算出該人臉框的面積(面積更大優(yōu)先)
 if area > 5*area_center:  # 判斷依據(jù),若面積優(yōu)先面積大于距離優(yōu)先面積的5倍,就實現(xiàn)面積優(yōu)先選擇焦點人物,否則就距離優(yōu)先。
  index_center = index_area# 面積優(yōu)先時,使用面積最大的人臉框序號
 for i, det in enumerate(faces):  # 遍歷所有人臉框
  if i == index_center:  # 確定焦點人臉框的序號
print(d_center, i)  # 輸出焦點人物的距離中心位置,方便調(diào)試
cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_focus, lineWidth_focus)
# 繪出焦點人臉框
shape = predictor(img, det)  # 從預(yù)測模型處,得到68個人物特征點
for p in shape.parts():  # 遍歷68個人物特征點
 cv2.circle(img, (p.x, p.y), 2, (124, 252, 0), -1)  # 設(shè)定焦點人物的68個點的形狀顏色,茶綠色、實心
  else:
cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_other, lineWidth_other)
# 繪出其他人臉框
shape = predictor(img, det)  # 從預(yù)測模型處,得到68個人物特征點
for p in shape.parts():  # 遍歷68個人物特征點
 cv2.circle(img, (p.x, p.y), 2, (255, 255, 255), -1)  # 設(shè)定其他人物的68個點的形狀顏色,白色、實心
 cv2.imshow('my webcam', img)  # 輸出繪好框后的幀動畫
 if cv2.waitKey(1) == 27:  # 設(shè)置一個滯留時間,等待用戶觸發(fā)事件,若用戶按下 ESC(ASCII碼為27),則執(zhí)行 if 體
  break  # (if主體)退出
cv2.destroyAllWindows()  # 銷毀所有輸出圖像窗

運行情況

為了容易分辨焦點人物與其他人物,首先將焦點人物框的寬度設(shè)為2,顏色設(shè)為紫紅色,68個識別點設(shè)為茶綠色;其他人物框的寬度設(shè)為1,顏色設(shè)為白色,68個識別點設(shè)為白色。
然后進行多次測試,通過整理測試結(jié)果,發(fā)現(xiàn)算法沒有錯誤,焦點人物按照距離和面積兩個因素來決定。成功運行圖如下:
不展示圖了,但是主人物為紫紅框,其他人物為白色圈。與預(yù)期一致。

到此這篇關(guān)于基于Python的人臉識別和焦點人物檢測的文章就介紹到這了,更多相關(guān)Python人臉識別和焦點人物檢測內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部