欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Python實(shí)現(xiàn)眨眼計(jì)數(shù)器的示例代碼

 更新時(shí)間:2022年02月07日 08:44:56   作者:一馬歸一碼  
這篇文章主要介紹了如何使用Python語(yǔ)言實(shí)現(xiàn)對(duì)視頻中的人物的眨眼進(jìn)行計(jì)數(shù)并描繪在圖表中,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以動(dòng)手試一試

一、前言

這幾天宅在家里網(wǎng)上沖浪,無(wú)意間看到了一個(gè)比較有趣的項(xiàng)目,就是使用 Python 語(yǔ)言實(shí)現(xiàn)對(duì)視頻中的人物的眨眼進(jìn)行計(jì)數(shù)并描繪在圖表中。我嘗試了一下,發(fā)現(xiàn)是可以實(shí)現(xiàn)的,所以自己碼了一遍代碼并簡(jiǎn)單注釋了一下,有興趣的朋友可以淺試一下。

該項(xiàng)目大致效果如下:

Now, let's start! 

二、實(shí)現(xiàn)步驟

對(duì)于創(chuàng)建項(xiàng)目文件夾配置環(huán)境以及如何安裝第三方庫(kù)這里就不再詳細(xì)的介紹了,有不會(huì)的同學(xué)可以去翻我之前的文章或者其他博主的文章去了解學(xué)習(xí)吧,并不是很難。

1.第三方庫(kù)

首先我們需要安裝 cvzone(一個(gè)比較專業(yè)的計(jì)算機(jī)視覺包,在面部識(shí)別,手勢(shì)、姿勢(shì)檢測(cè)中為我們提供了很多便利)。還有一個(gè)包是 mediapipe,我們將會(huì)使用它來(lái)實(shí)現(xiàn)面部檢測(cè)網(wǎng)絡(luò),以便于對(duì)視頻中的眼睛部位進(jìn)行觀察。

2.導(dǎo)入視頻文件并播放

實(shí)現(xiàn)代碼及效果如下:

import cv2
import cvzone
 
cap = cv2.VideoCapture('BlinkCounter.mp4')#獲取需要檢測(cè)的視頻(添加視頻路徑即可,此處由于視頻和Python文件在同一路徑,直接調(diào)用即可)
 
while True:
    success, img = cap.read()
    img = cv2.resize(img, (640, 360)) #對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
    cv2.imshow("Image", img)          #顯示圖像
    cv2.waitKey(1)

3.讓視頻循環(huán)播放

我們要對(duì)視頻中的眨眼次數(shù)進(jìn)行計(jì)數(shù),但通過上面的代碼可以看出視頻很快就播放結(jié)束了,所以我們采用檢查視頻幀數(shù)的方式,當(dāng)達(dá)到視頻的最后一幀時(shí)對(duì)其進(jìn)行重置,達(dá)到循環(huán)播放視頻的目的。代碼如下:

#------------------------------------------------------------
#檢查當(dāng)前幀數(shù)是否等于視頻的總體幀數(shù),如果相等,將播放幀數(shù)重置為0
#------------------------------------------------------------
    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):  
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

4.創(chuàng)建面部檢測(cè)器

該步驟需要使用到 cvzone 中的相應(yīng)模塊來(lái)實(shí)現(xiàn),具體代碼及注釋如下:

import cv2
import cvzone
from cvzone.FaceMeshModule import FaceMeshDetector  #調(diào)用面部檢測(cè)模塊
 
cap = cv2.VideoCapture('BlinkCounter.mp4')#獲取需要檢測(cè)的視頻(添加視頻路徑即可,此處由于視頻和Python文件在同一路徑,直接調(diào)用即可)
detector = FaceMeshDetector(maxFaces = 1)#創(chuàng)建人臉網(wǎng)絡(luò)檢測(cè)器,檢測(cè)面部數(shù)量為1
 
while True:
#------------------------------------------------------------
#檢查當(dāng)前幀數(shù)是否等于視頻的總體幀數(shù),如果相等,將播放幀數(shù)重置為0
#------------------------------------------------------------
    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
#------------------------------------------------------------
    success, img = cap.read()
    img, faces = detector.findFaceMesh(img)#繪制人臉網(wǎng)絡(luò)
 
    img = cv2.resize(img, (640, 360)) #對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
    cv2.imshow("Image", img)          #顯示圖像
    cv2.waitKey(1) 

得到的結(jié)果如下:

5.對(duì)眼睛周圍的點(diǎn)進(jìn)行標(biāo)記

由于面部檢測(cè)器是對(duì)面部用點(diǎn)進(jìn)行標(biāo)記的,所以我們需要找到那些眼睛周圍的點(diǎn)并將它們使用特殊的點(diǎn)來(lái)進(jìn)行標(biāo)記,從而達(dá)到檢測(cè)眼睛閉合與張開的目的,相應(yīng)的點(diǎn)數(shù)以及代碼如下:

idList = [22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]#面部檢測(cè)器中眼眶周圍的像素點(diǎn)
 
color = (0, 0, 255)#將顏色設(shè)置為紅色
 
#------------------------------------------------------------
#檢測(cè)到面部時(shí)將面部的關(guān)于眼眶的點(diǎn)用圓圈表示出來(lái),并填補(bǔ)完整
#------------------------------------------------------------
    if faces:
        face = faces[0]
        for id in idList:
            cv2.circle(img, face[id], 5, color, cv2.FILLED)

得到的效果如下,可以看出,已經(jīng)對(duì)眼眶進(jìn)行了標(biāo)記:

我們可以對(duì)面部檢測(cè)網(wǎng)絡(luò)進(jìn)行設(shè)置,讓其他的一些點(diǎn)不再顯示出來(lái),只關(guān)注我們的目標(biāo)點(diǎn),具體操作方式是只需要在函數(shù)中添加一個(gè)參數(shù)即可,效果如下:

img, faces = detector.findFaceMesh(img, draw = False)#繪制人臉檢測(cè)網(wǎng)絡(luò),將參數(shù) draw 修改為    False 即可抹去其他的不必要的點(diǎn)

6.觀察眼睛寬度和長(zhǎng)度變化并進(jìn)行計(jì)數(shù)

如果單純的靠上下眼皮的變化來(lái)檢測(cè)是否眨眼會(huì)造成判斷錯(cuò)誤,所以我們需要結(jié)合眼睛長(zhǎng)度和寬度之比進(jìn)行判斷。將這項(xiàng)數(shù)據(jù)的變化趨勢(shì)繪制在一個(gè)窗口中,就會(huì)使得我們的觀察更加明顯,得到的效果也將更加優(yōu)良。具體代碼如下:

#-------------------------------------------------------------
#使用眼眶周圍不同的點(diǎn)之間的距離以及眼睛寬度和長(zhǎng)度的對(duì)比進(jìn)行眨眼計(jì)數(shù)
#-------------------------------------------------------------
        leftUp = face[159]#定義不同部位的像素點(diǎn)
        leftDown = face[23]
        leftLeft = face[130]
        leftRight = face[243]
        lenghtVer, _ = detector.findDistance(leftUp, leftDown)#得到眼睛寬度
        lenghtHor, _ = detector.findDistance(leftLeft, leftRight)#得到眼睛長(zhǎng)度
 
        cv2.line(img, leftUp, leftDown, (0, 200, 0), 3)#繪制與眼睛等寬的線段
        cv2.line(img, leftLeft, leftRight, (0, 200, 0), 3)#繪制與眼睛等長(zhǎng)的線段
 
        ratio = int((lenghtVer / lenghtHor) * 100)#得到的數(shù)據(jù)并進(jìn)行標(biāo)準(zhǔn)化,得到比率值
 
        ratioList.append(ratio)#使用比率值填補(bǔ)列表
        #------------------------------------------------------------------
        #從之前的一共三個(gè)比率中得到平均值,如果比率數(shù)目大于3將會(huì)刪去前面的比率值
        #------------------------------------------------------------------
        if len(ratioList) > 3:
            ratioList.pop(0)
        ratioAvg = sum(ratioList) / len(ratioList)#得到比率平均值
        #------------------------------------
        #通過比率平均值的變化對(duì)眨眼次數(shù)進(jìn)行計(jì)數(shù)
        #------------------------------------
        if ratioAvg < 35 and counter == 0:
            blinkCounter += 1#變化一次,計(jì)數(shù)器加一
            color = (0, 200, 0)
            counter = 1
        if counter != 0:
            counter += 1
            if counter > 10:
                counter = 0
                color = (255, 0, 255)
        #-----------------------------
        #編寫文本框來(lái)記錄眨眼的總體次數(shù)
        #------------------------------
        cvzone.putTextRect(img, f'Blink Count: {blinkCounter}', (50, 250),
                           12, colorR = color)
 
        imgPlot = plotY.update(ratioAvg, color)
        img = cv2.resize(img, (400, 640))  # 對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
        imgStack = cvzone.stackImages([img, imgPlot], 2, 1)#將兩幅圖像放到一起,疊放為2列圖像
    else:
        img = cv2.resize(img, (400, 640))  # 對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
        imgStack = cvzone.stackImages([img, img], 2, 1)

通過以上步驟大致就能實(shí)現(xiàn)眨眼計(jì)數(shù)了。 

三、整體代碼

整體代碼如下,已經(jīng)添加了注釋,如果有解釋的不清楚的地方可以在評(píng)論區(qū)交流。

import cv2
import cvzone
from cvzone.FaceMeshModule import FaceMeshDetector
from cvzone.PlotModule import LivePlot
 
cap = cv2.VideoCapture('BlinkCounter.mp4')#獲取需要檢測(cè)的視頻(添加視頻路徑即可,此處由于視頻和Python文件在同一路徑,直接調(diào)用即可)
detector = FaceMeshDetector(maxFaces = 1)#創(chuàng)建人臉網(wǎng)絡(luò)檢測(cè)器,檢測(cè)面部數(shù)量為1
plotY = LivePlot(640, 640, [20, 50], invert = True)#創(chuàng)建窗口來(lái)繪制數(shù)據(jù)的變化
 
idList = [22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]#面部檢測(cè)器中眼眶周圍的像素點(diǎn)
ratioList = []#創(chuàng)建一個(gè)空的比率列表
blinkCounter = 0
counter = 0#避免每一個(gè)幀節(jié)進(jìn)行一次計(jì)數(shù)
 
color = (0, 0, 255)#將顏色設(shè)置為紅色
 
while True:
#------------------------------------------------------------
#檢查當(dāng)前幀數(shù)是否等于視頻的總體幀數(shù),如果相等,將播放幀數(shù)重置為0
#------------------------------------------------------------
    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
 
    success, img = cap.read()#讀取到的視頻
    img, faces = detector.findFaceMesh(img, draw = False)#繪制人臉檢測(cè)網(wǎng)絡(luò)
#------------------------------------------------------------
#檢測(cè)到面部時(shí)將面部的關(guān)于眼眶的點(diǎn)用圓圈表示出來(lái),并填補(bǔ)完整
#------------------------------------------------------------
    if faces:
        face = faces[0]
        for id in idList:
            cv2.circle(img, face[id], 5, color, cv2.FILLED)
#-------------------------------------------------------------
#使用眼眶周圍不同的點(diǎn)之間的距離以及眼睛寬度和長(zhǎng)度的對(duì)比進(jìn)行眨眼計(jì)數(shù)
#-------------------------------------------------------------
        leftUp = face[159]#定義不同部位的像素點(diǎn)
        leftDown = face[23]
        leftLeft = face[130]
        leftRight = face[243]
        lenghtVer, _ = detector.findDistance(leftUp, leftDown)#得到眼睛寬度
        lenghtHor, _ = detector.findDistance(leftLeft, leftRight)#得到眼睛長(zhǎng)度
 
        cv2.line(img, leftUp, leftDown, (0, 200, 0), 3)#繪制與眼睛等寬的線段
        cv2.line(img, leftLeft, leftRight, (0, 200, 0), 3)#繪制與眼睛等長(zhǎng)的線段
 
        ratio = int((lenghtVer / lenghtHor) * 100)#得到的數(shù)據(jù)并進(jìn)行標(biāo)準(zhǔn)化,得到比率值
 
        ratioList.append(ratio)#使用比率值填補(bǔ)列表
        #------------------------------------------------------------------
        #從之前的一共三個(gè)比率中得到平均值,如果比率數(shù)目大于3將會(huì)刪去前面的比率值
        #------------------------------------------------------------------
        if len(ratioList) > 3:
            ratioList.pop(0)
        ratioAvg = sum(ratioList) / len(ratioList)#得到比率平均值
        #------------------------------------
        #通過比率平均值的變化對(duì)眨眼次數(shù)進(jìn)行計(jì)數(shù)
        #------------------------------------
        if ratioAvg < 35 and counter == 0:
            blinkCounter += 1#變化一次,計(jì)數(shù)器加一
            color = (0, 200, 0)
            counter = 1
        if counter != 0:
            counter += 1
            if counter > 10:
                counter = 0
                color = (255, 0, 255)
        #-----------------------------
        #編寫文本框來(lái)記錄眨眼的總體次數(shù)
        #------------------------------
        cvzone.putTextRect(img, f'Blink Count: {blinkCounter}', (50, 250),
                           12, colorR = color)
 
        imgPlot = plotY.update(ratioAvg, color)
        img = cv2.resize(img, (400, 640))  # 對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
        imgStack = cvzone.stackImages([img, imgPlot], 2, 1)#將兩幅圖像放到一起,疊放為2列圖像
    else:
        img = cv2.resize(img, (400, 640))  # 對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
        imgStack = cvzone.stackImages([img, img], 2, 1)
 
    img = cv2.resize(img, (400, 640)) #對(duì)圖像尺寸進(jìn)行調(diào)節(jié)
    cv2.imshow("Image", imgStack)
    cv2.waitKey(1)

以上就是利用Python實(shí)現(xiàn)眨眼計(jì)數(shù)器的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python眨眼計(jì)數(shù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • wxPython的安裝與使用教程

    wxPython的安裝與使用教程

    wxPython是Python語(yǔ)言的一套優(yōu)秀的GUI圖形庫(kù)。wxPython可以很方便的創(chuàng)建完整的、功能鍵全的GUI用戶界面。這篇文章給大家介紹了wxPython的安裝與使用,感興趣的朋友一起看看吧
    2018-08-08
  • CNN卷積函數(shù)Conv2D()各參數(shù)的含義及用法解讀

    CNN卷積函數(shù)Conv2D()各參數(shù)的含義及用法解讀

    這篇文章主要介紹了CNN卷積函數(shù)Conv2D()各參數(shù)的含義及用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Appium+Python自動(dòng)化環(huán)境搭建實(shí)例教程

    Appium+Python自動(dòng)化環(huán)境搭建實(shí)例教程

    這篇文章主要介紹了Appium+Python自動(dòng)化環(huán)境搭建實(shí)例教程,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python制作簡(jiǎn)易版2048小游戲

    Python制作簡(jiǎn)易版2048小游戲

    2048作為經(jīng)典的手機(jī)端游戲一直深受大家的喜愛,本文將利用Python中的Pygame模塊制作簡(jiǎn)單版的2048游戲,感興趣的小伙伴可以了解一下
    2022-07-07
  • python 簡(jiǎn)單的多線程鏈接實(shí)現(xiàn)代碼

    python 簡(jiǎn)單的多線程鏈接實(shí)現(xiàn)代碼

    這篇文章主要介紹了python 簡(jiǎn)單的多線程鏈接實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2016-08-08
  • django框架基于模板 生成 excel(xls) 文件操作示例

    django框架基于模板 生成 excel(xls) 文件操作示例

    這篇文章主要介紹了django框架基于模板 生成 excel(xls) 文件操作,結(jié)合具體實(shí)例形式分析了Django框架基于模板生成excel的實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • python 列表,數(shù)組和矩陣sum的用法及區(qū)別介紹

    python 列表,數(shù)組和矩陣sum的用法及區(qū)別介紹

    今天小編就為大家分享一篇python 列表,數(shù)組和矩陣sum的用法及區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-06-06
  • 如何使用Python抓取網(wǎng)頁(yè)tag操作

    如何使用Python抓取網(wǎng)頁(yè)tag操作

    這篇文章主要介紹了如何使用Python抓取網(wǎng)頁(yè)tag操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python中Dataframe數(shù)據(jù)排序方法(含實(shí)例講解)

    Python中Dataframe數(shù)據(jù)排序方法(含實(shí)例講解)

    在進(jìn)行數(shù)據(jù)分析操作時(shí),經(jīng)常需要對(duì)數(shù)據(jù)按照某行某列排序,或者按照多行多列排序,以及按照索引值排序等等,下面這篇文章主要給大家介紹了關(guān)于Python中Dataframe數(shù)據(jù)排序方法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • python3實(shí)現(xiàn)tailf命令的示例代碼

    python3實(shí)現(xiàn)tailf命令的示例代碼

    本文主要介紹了python3實(shí)現(xiàn)tailf命令的示例代碼,tail -f 是一個(gè)linux的操作命令.其主要的是會(huì)把文件里的最尾部的內(nèi)容顯顯示在屏幕上,并且不斷刷新,只要文件有變動(dòng)就可以看到最新的文件內(nèi)容,感興趣的可以了解一下
    2023-11-11

最新評(píng)論