溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python運動檢測怎么應(yīng)用

發(fā)布時間:2023-04-26 14:07:51 來源:億速云 閱讀:83 作者:zzz 欄目:編程語言

這篇“Python運動檢測怎么應(yīng)用”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python運動檢測怎么應(yīng)用”文章吧。

什么是運動檢測?

根據(jù)物理學(xué)原理,當一個物體靜止不動且沒有速度時,它就被認為處于靜止狀態(tài);而恰恰相反的是,當一物體沒有完全靜止且在某個方向(無論是左右、前后或上下)上有一定的運動或速度時,它都被認為處于運動狀態(tài)。在本文中,我們將嘗試檢測出物體的運行情況。

目前,運動檢測在現(xiàn)實生活中已經(jīng)存在大量實現(xiàn)或應(yīng)用,這充分證明其巨大的應(yīng)用價值。其中,使用網(wǎng)絡(luò)攝像頭(我們將在本文中實現(xiàn))作為安全警衛(wèi)進行在線考試監(jiān)考等是最典型的應(yīng)用。

在本文中,我們將嘗試實現(xiàn)一個腳本。通過該腳本,我們將使用臺式機或筆記本電腦上安裝的網(wǎng)絡(luò)攝像頭實現(xiàn)對物體運動的檢測。我們的想法是,我們將拍攝兩幀視頻,并試圖找出它們之間的差異。如果兩幀之間存在某種差異,那么很明顯,相機前面的物體存在某種移動,這就產(chǎn)生了差異。

主要的參考庫

在著手實現(xiàn)代碼之前,讓我們先看看我們將在代碼中使用的一些模塊或庫,這些模塊或庫用于操作網(wǎng)絡(luò)攝像頭進行運動檢測。正如我們所討論的,這些開源庫對于Python聲譽的傳播起著重要作用。讓我們看看本文示例項目中需要的開源庫:

  • OpenCV

  • Pandas

上述兩個庫OpenCV和Pandas都是純粹基于Python的免費開源庫,我們將通過Python語言的Python3版本來使用它們。

1.OpenCV

OpenCV是一個非常著名的開源庫,可以與許多編程語言(如C++、Python等)一起使用,專門應(yīng)用于處理圖像和視頻程序開發(fā)。通過與Python的開源庫Pandas或者NumPy庫集成應(yīng)用,我們可以充分挖掘出OpenCV的功能。

2.Pandas

Pandas是一個開放源碼的Python庫,為數(shù)據(jù)分析提供了豐富的內(nèi)置工具;因此,在數(shù)據(jù)科學(xué)和數(shù)據(jù)分析領(lǐng)域得到了廣泛的應(yīng)用。在Pandas中提供了數(shù)據(jù)結(jié)構(gòu)形式DataFrame數(shù)據(jù)幀,這種結(jié)構(gòu)對于將表格數(shù)據(jù)操作和存儲到二維數(shù)據(jù)結(jié)構(gòu)中提供了極方便的支持。

上述兩個模塊都不是Python內(nèi)置的,我們必須在使用前先安裝它們。除此之外,我們還將在項目中使用另外兩個模塊。

  • Python日期時間(DateTime)模塊

  • Python時間(Time)模塊

這兩個模塊都內(nèi)置在Python中,以后無需安裝。這些模塊分別用來處理與日期和時間相關(guān)的功能。

代碼實現(xiàn)

到目前為止,我們已經(jīng)看到了我們將在代碼中使用的庫。接下來,讓我們從視頻只是許多靜態(tài)圖像或幀的組合這一假定開始,然后使用所有這些幀的組合來創(chuàng)建一個視頻。

導(dǎo)入所需的庫

在本節(jié)中,我們將首先導(dǎo)入所有庫,如Pandas和OpenCV。然后,我們從DateTime模塊導(dǎo)入time和DateTime函數(shù)。

#導(dǎo)入Pandas庫
import Pandas as panda

# 導(dǎo)入OpenCV庫
import cv2

#導(dǎo)入時間模塊
import time

#從datetime 模塊導(dǎo)入datetime 函數(shù) 
from datetime import datetime
初始化數(shù)據(jù)變量

在本節(jié)中,我們要初始化一些變量,并將在代碼中進一步使用這些變量。首先,我們將初始狀態(tài)定義為“None”,然后通過另一個變量motionTrackList來存儲跟蹤的運動。

此外,我們還定義了一個列表“motionTime”,用于存儲發(fā)現(xiàn)運動的時間,并使用Panda的模塊初始化數(shù)據(jù)幀列表。

# 對于初始幀,以變量initialState的形式將初始狀態(tài)指定為None
initialState = None

# 幀中檢測到任何運動時存儲所有軌跡的列表 
motionTrackList= [ None, None ]

# 一個新的“時間”列表,用于存儲檢測到移動時的時間
motionTime = []

# 使用帶有初始列和最終列的Panda庫初始化數(shù)據(jù)幀變量“DataFrame” 
dataFrame = panda.DataFrame(columns = ["Initial", "Final"])
關(guān)鍵幀捕獲過程

在本節(jié)中,我們將實現(xiàn)本文示例項目中最關(guān)鍵的運動檢測步驟。下面,讓我們分步驟進行解說:

  1. 首先,我們將開始使用cv2模塊捕獲視頻,并將其存儲在視頻變量中。

  2. 然后,我們將使用無限while循環(huán)從視頻中捕獲每一幀。

  3. 接下來,將使用read()方法讀取每個幀,并將它們存儲到各自的變量中。

  4. 我們定義了一個變量var_motion,并將其初始化為零。

  5. 我們使用cv2函數(shù)cvtColor和GaussianBlur創(chuàng)建另外兩個變量grayImage和grayFrame,以找到運動中的變化。

  6. 如果我們的initialState為None,則我們將當前grayFrame指定為initialState;否則,使用“continue”關(guān)鍵字跳過后面代碼的執(zhí)行。

  7. 在后面代碼中,我們計算在當前迭代中創(chuàng)建的初始幀和灰度幀grayscale之間的差異。

  8. 然后,我們將使用cv2閾值和dilate函數(shù)突出顯示初始幀和當前幀之間的變化。

  9. 我們將從當前圖像或幀中的運動對象中找到輪廓,并通過使用rectangle函數(shù)在其周圍創(chuàng)建綠色邊界來指示運動對象。

  10. 在此之后,我們將把當前檢測到的元素添加到列表變量motionTrackList。

  11. 到目前為止,我們已經(jīng)通過使用imshow方法顯示出如灰度和原始幀等所有的關(guān)鍵幀。

  12. 此外,我們還使用cv2模塊的witkey()方法來結(jié)束進程。程序中,我們選擇使用按下鍵盤上的'm'鍵來結(jié)束我們的進程。

# 使用cv2模塊啟動網(wǎng)絡(luò)攝像頭以捕獲視頻 
video = cv2.VideoCapture(0)

# 使用無限循環(huán)從視頻中捕獲幀
while True:

 # 使用read功能從視頻中讀取每個圖像或幀

 check, cur_frame = video.read()

 

 #將'motion'變量定義為等于零的初始幀

 var_motion = 0

 

 # 從彩色圖像創(chuàng)建灰色幀 

 gray_image = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)

 

 # 從灰度圖像中使用GaussianBlur函數(shù)找到變化部分

 gray_frame = cv2.GaussianBlur(gray_image, (21, 21), 0)

 

 # 在第一次迭代時進行條件檢查

 # 如果為None,則把grayFrame賦值給變量initalState

 if initialState is None:

 initialState = gray_frame

 continue

 

 # 計算靜態(tài)(或初始)幀與我們創(chuàng)建的灰色幀之間的差異

 differ_frame = cv2.absdiff(initialState, gray_frame)

 

 # 靜態(tài)或初始背景與當前灰色幀之間的變化將突出顯示 

 

 thresh_frame = cv2.threshold(differ_frame, 30, 255, cv2.THRESH_BINARY)[1]

 thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)

 

 #對于幀中的移動對象,查找輪廓

 cont,_ = cv2.findContours(thresh_frame.copy(), 

cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

 

 for cur in cont:

 if cv2.contourArea(cur) < 10000:

 continue

 var_motion = 1

 (cur_x, cur_y,cur_w, cur_h) = cv2.boundingRect(cur)

 

 # 在移動對象周圍創(chuàng)建一個綠色矩形

 cv2.rectangle(cur_frame, (cur_x, cur_y), (cur_x + cur_w, cur_y + cur_h), (0, 255, 0), 3)

 

# 從幀中添加運動狀態(tài) 

 motionTrackList.append(var_motion)

 motionTrackList = motionTrackList[-2:]

 

 # 添加運動的開始時間 

 if motionTrackList[-1] == 1 and motionTrackList[-2] == 0:

 motionTime.append(datetime.now())

 

# 添加運動的結(jié)束時間 

 if motionTrackList[-1] == 0 and motionTrackList[-2] == 1:

 motionTime.append(datetime.now())

 

# 在顯示捕獲圖像的灰度級中 

 cv2.imshow("The image captured in the Gray Frame is shown below: ", gray_frame)

 

 # 顯示初始靜態(tài)幀和當前幀之間的差異 

 cv2.imshow("Difference between theinital static frame and the current frame: ", differ_frame)

 

 # 在框架屏幕上顯示視頻中的黑白圖像 

 cv2.imshow("Threshold Frame created from the PC or Laptop Webcam is: ", thresh_frame)

 

 #通過彩色框顯示物體的輪廓

 cv2.imshow("From the PC or Laptop webcam, this is one example of the Colour Frame:", cur_frame)

 

 # 創(chuàng)建處于等待狀態(tài)的鍵盤按鍵 

 wait_key = cv2.waitKey(1)

 

 # 按下'm'鍵時,結(jié)束整個進程執(zhí)行

 if wait_key == ord('m'):

 # 當屏幕上有東西移動時,將運動變量值添加到motiontime列表中 

 if var_motion == 1:

 motionTime.append(datetime.now())

 break
代碼收尾工作

在結(jié)束循環(huán)體執(zhí)行后,我們將從dataFrame和motionTime列表中添加數(shù)據(jù)到CSV文件中,最后關(guān)閉視頻。這一部分代碼的實現(xiàn)如下所示:

# 最后,我們在數(shù)據(jù)幀中添加運動時間 
for a in range(0, len(motionTime), 2):

 dataFrame = dataFrame.append({"Initial" : time[a], "Final" : motionTime[a + 1]}, ignore_index = True)

 
# 創(chuàng)建CSV文件記錄下所有運動信息
dataFrame.to_csv("EachMovement.csv")

# 釋放視頻內(nèi)存 
video.release()

#現(xiàn)在,在openCV的幫助下關(guān)閉或銷毀所有打開的窗口
cv2.destroyAllWindows()

至此,我們已經(jīng)成功地創(chuàng)建完所有代碼?,F(xiàn)在,讓我們再次歸納一下整個過程。

首先,我們使用設(shè)備的網(wǎng)絡(luò)攝像頭捕捉視頻,然后將輸入視頻的初始幀作為參考,并不時檢查下一幀。如果發(fā)現(xiàn)與第一幀不同的幀,則說明存在運動。該信息將被標記在綠色矩形中。

完整的代碼

現(xiàn)在,讓我們把上面所有代碼片斷連接到一起,如下所示:

#導(dǎo)入Pandas庫
import Pandas as panda

# 導(dǎo)入OpenCV庫
import cv2

#導(dǎo)入時間模塊
import time

#從datetime 模塊導(dǎo)入datetime 函數(shù) 
from datetime import datetime 

# 對于初始幀,以變量initialState的形式將初始狀態(tài)指定為None
initialState = None

# 幀中檢測到任何運動時存儲所有軌跡的列表 
motionTrackList= [ None, None ]

# 一個新的“時間”列表,用于存儲檢測到移動時的時間
motionTime = []

# 使用帶有初始列和最終列的Panda庫初始化數(shù)據(jù)幀變量“DataFrame” 
dataFrame = panda.DataFrame(columns = ["Initial", "Final"])

# 使用cv2模塊啟動網(wǎng)絡(luò)攝像頭以捕獲視頻 
video = cv2.VideoCapture(0)

# 使用無限循環(huán)從視頻中捕獲幀
while True:

 # 使用read功能從視頻中讀取每個圖像或幀

 check, cur_frame = video.read()

 

 #將'motion'變量定義為等于零的初始幀

 var_motion = 0

 

 # 從彩色圖像創(chuàng)建灰色幀 

 gray_image = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)

 

 # 從灰度圖像中使用GaussianBlur函數(shù)找到變化部分

 gray_frame = cv2.GaussianBlur(gray_image, (21, 21), 0)

 

 # 在第一次迭代時進行條件檢查

 # 如果為None,則把grayFrame賦值給變量initalState

 if initialState is None:

 initialState = gray_frame

 continue

 

 # 計算靜態(tài)(或初始)幀與我們創(chuàng)建的灰色幀之間的差異

 differ_frame = cv2.absdiff(initialState, gray_frame)

 

 # 靜態(tài)或初始背景與當前灰色幀之間的變化將突出顯示 

 

 thresh_frame = cv2.threshold(differ_frame, 30, 255, cv2.THRESH_BINARY)[1]

 thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)

 

 #對于幀中的移動對象,查找輪廓

 cont,_ = cv2.findContours(thresh_frame.copy(), 

cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

 

 for cur in cont:

 if cv2.contourArea(cur) < 10000:

 continue

 var_motion = 1

 (cur_x, cur_y,cur_w, cur_h) = cv2.boundingRect(cur)

 

 # 在移動對象周圍創(chuàng)建一個綠色矩形

 cv2.rectangle(cur_frame, (cur_x, cur_y), (cur_x + cur_w, cur_y + cur_h), (0, 255, 0), 3)

 

# 從幀中添加運動狀態(tài) 

 motionTrackList.append(var_motion)

 motionTrackList = motionTrackList[-2:]

 

 # 添加運動的開始時間 

 if motionTrackList[-1] == 1 and motionTrackList[-2] == 0:

 motionTime.append(datetime.now())

 

# 添加運動的結(jié)束時間 

 if motionTrackList[-1] == 0 and motionTrackList[-2] == 1:

 motionTime.append(datetime.now())

 

# 在顯示捕獲圖像的灰度級中 

 cv2.imshow("The image captured in the Gray Frame is shown below: ", gray_frame)

 

 # 顯示初始靜態(tài)幀和當前幀之間的差異 

 cv2.imshow("Difference between theinital static frame and the current frame: ", differ_frame)

 

 # 在框架屏幕上顯示視頻中的黑白圖像 

 cv2.imshow("Threshold Frame created from the PC or Laptop Webcam is: ", thresh_frame)

 

 #通過彩色框顯示物體的輪廓

 cv2.imshow("From the PC or Laptop webcam, this is one example of the Colour Frame:", cur_frame)

 

 # 創(chuàng)建處于等待狀態(tài)的鍵盤按鍵 

 wait_key = cv2.waitKey(1)

 

 # 借助'm'鍵結(jié)束我們系統(tǒng)的整個進行 

 if wait_key == ord('m'):

 # 當屏幕上有物體運行時把運動變量值添加到列表motiontime中

 if var_motion == 1:

 motionTime.append(datetime.now())

 break 

# 最后,我們在數(shù)據(jù)幀中添加運動時間 
for a in range(0, len(motionTime), 2):

 dataFrame = dataFrame.append({"Initial" : time[a], "Final" : motionTime[a + 1]}, ignore_index = True)

 
# 記錄下所有運行,并創(chuàng)建到一個CSV文件中 
dataFrame.to_csv("EachMovement.csv")

# 釋放視頻內(nèi)存
video.release()

#現(xiàn)在,在openCV的幫助下關(guān)閉或銷毀所有打開的窗口
cv2.destroyAllWindows()

以上就是關(guān)于“Python運動檢測怎么應(yīng)用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI