溫馨提示×

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

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

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

發(fā)布時(shí)間:2021-10-11 17:06:37 來(lái)源:億速云 閱讀:188 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。


運(yùn)動(dòng)檢測(cè)是指檢測(cè)物體相對(duì)于周圍環(huán)境的位置是否發(fā)生了變化。接下來(lái),讓我們一起使用Python實(shí)現(xiàn)一個(gè)運(yùn)動(dòng)檢測(cè)器應(yīng)用程序吧!

該運(yùn)動(dòng)檢測(cè)器可以完成以下任務(wù):

1)在家工作時(shí)在屏幕前查找時(shí)間

2) 監(jiān)控孩子在屏幕前的時(shí)間

3) 在你的后院發(fā)現(xiàn)非法侵入

4) 在你的房間/房子/小巷周圍找到不需要的公共/動(dòng)物活動(dòng)……。

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

想要實(shí)現(xiàn)該運(yùn)動(dòng)檢測(cè)器程序我們需要具備以下條件:

1)硬件要求:裝有網(wǎng)絡(luò)攝像機(jī)或任何類型攝像機(jī)的計(jì)算機(jī)。

2)軟件需求:Pyhton3或者更高版本。

3)附加要求:對(duì)運(yùn)動(dòng)檢測(cè)有一定的興趣。

接下來(lái)我們將一步步的完成該應(yīng)用程序的構(gòu)建。

首先,我們將通過(guò)網(wǎng)絡(luò)攝像頭捕獲第一幀,并將它視為基準(zhǔn)幀,如下圖所示。通過(guò)計(jì)算該基準(zhǔn)幀中的對(duì)象與新幀對(duì)象之間的相位差來(lái)檢測(cè)運(yùn)動(dòng)。我們也將得到的結(jié)果稱為Delta幀。

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

接下來(lái),我們將使用像素強(qiáng)度來(lái)優(yōu)化Delta幀,優(yōu)化后的幀稱為閾值幀。并且,我們將應(yīng)用一些復(fù)雜的圖像處理技術(shù),例如陰影消除、擴(kuò)張輪廓等,以完成在閾值幀上提取對(duì)象物體。以下是您要實(shí)現(xiàn)的目標(biāo):

被探測(cè)對(duì)象

當(dāng)這個(gè)對(duì)象進(jìn)入幀和退出幀時(shí),我們能夠很容易的捕獲這兩幀的時(shí)間戳。因此,將能夠準(zhǔn)確的在視頻中找到相關(guān)片段。

我們希望小伙伴都能自己實(shí)現(xiàn)這個(gè)程序,因此我們就不直接嵌入代碼了。

從最基本的安裝開(kāi)始,我們需要安裝Python3或更高版本,并使用pip安裝pandas和OpenCV這兩個(gè)庫(kù)。這些工作做好,我們的準(zhǔn)備工作就完成了。

第一步:導(dǎo)入需要的庫(kù):

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

第二步:初始化變量,列表,data frame:

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

在下面的代碼中,我們將會(huì)了解到在什么時(shí)候需要使用上面涉及到的每一項(xiàng)。

第三步:使用網(wǎng)絡(luò)攝像機(jī)捕獲視頻幀:

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

在OpenCV中有能夠打開(kāi)相機(jī)并捕獲視頻幀的內(nèi)置函數(shù)。其中輸入?yún)?shù)“0”表示計(jì)算機(jī)硬件端口號(hào)為0的攝像機(jī)。如果我們擁有了多個(gè)攝像頭或閉路電視等設(shè)置,可以通過(guò)該參數(shù)提供相應(yīng)的端口號(hào)。

第四步:將捕捉到的幀轉(zhuǎn)換為灰度圖像,并應(yīng)用高斯模糊去除噪聲:

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

由于彩色圖片中每個(gè)像素均具有三個(gè)顏色通道,實(shí)際上我們并不需要使用這么多的信息,因此首先將彩色幀轉(zhuǎn)換成灰度幀。再利用高斯模糊對(duì)圖像進(jìn)行平滑處理,進(jìn)而提高檢測(cè)精度。在高斯模糊函數(shù)中,我們利用第2個(gè)參數(shù)定義了高斯核的寬度和高度;利用第3個(gè)參數(shù),定義了標(biāo)準(zhǔn)偏差值。在這里我們可以使用核大小為(21,21),標(biāo)準(zhǔn)偏差為0的標(biāo)準(zhǔn)值。想要了解有關(guān)高斯平滑的更多信息,請(qǐng)參考:

Smoothing Images - OpenCV 2.4.13.7 documentation In an analogous way as the Gaussian filter, the bilateral filter also considers the neighboring pixels with weights…

docs.opencv.org

第五步:捕獲第一個(gè)灰度幀

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

第一幀是整個(gè)處理過(guò)程中的基準(zhǔn)幀。通過(guò)計(jì)算此基準(zhǔn)幀與新幀之間特定對(duì)象的相位差來(lái)檢測(cè)運(yùn)動(dòng)。在拍攝第一幀時(shí),特定對(duì)象相機(jī)前不應(yīng)有任何移動(dòng)。但是得到的第一幀并不需要后續(xù)處理,因此我們可以用continue語(yǔ)句跳過(guò)后續(xù)過(guò)程。

第六步:創(chuàng)建Delta幀和閾值幀

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

現(xiàn)在,我們需要找出第一幀和當(dāng)前幀之間的區(qū)別。因此,我們使用absdiff函數(shù)并將得到的結(jié)果稱為delta幀。對(duì)于我們的用例來(lái)說(shuō),僅僅找到一個(gè)差異是不夠的,所以我們需要定義一個(gè)像素閾值,它可以被視為真實(shí)的對(duì)象。

我們可以選擇30像素作為標(biāo)準(zhǔn)閾值,并將標(biāo)準(zhǔn)閾值的顏色定義為白色(顏色代碼:255). 二元閾值函數(shù)THRESH_BINARY返回一個(gè)元組值,其中只有第二項(xiàng)([0]是第一項(xiàng),[1]是第二項(xiàng))包含生成的閾值幀。二元閾值函數(shù)用于處理含有2個(gè)離散值的非連續(xù)函數(shù):如0或1。如果攝影機(jī)前面沒(méi)有對(duì)象,我們將當(dāng)前幀的狀態(tài)視為0;如果攝影機(jī)前面存在對(duì)象,則將當(dāng)前幀的狀態(tài)視為1。

更多閾值圖像處理相關(guān)知識(shí),請(qǐng)參考:

Miscellaneous Image Transformations - OpenCV 2.4.13.7 documentation Performs a marker-based image segmentation using the watershed algorithm. The function implements one of the variants…

docs.opencv.org

第七步:膨脹閾值幀并在其中找到輪廓像素

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

“我們的眼睛總是被光線吸引,但陰影處有更多內(nèi)容。”—格雷戈里·馬奎爾

對(duì)象的每個(gè)部分都會(huì)在背景或自身的其他部分留下一定的陰影。這似乎總是讓我們感到很困惑。例如,鼻子投射在嘴唇上的陰影,較大的靜止物體在旁邊的小物體上投射的陰影。飄動(dòng)的光源,不同發(fā)光強(qiáng)度的多個(gè)光源,你房間的窗簾,光源的方向和視角等等都會(huì)對(duì)陰影造成一定的影響。

以下是在實(shí)時(shí)捕獲的幀中發(fā)現(xiàn)的一些干擾。因此,為了使這些噪聲最小化,我們需要對(duì)圖像進(jìn)行濾波。在膨脹函數(shù)Dilate中,我們可以通過(guò)設(shè)置迭代次數(shù)來(lái)設(shè)置平滑度。迭代次數(shù)越多,平滑度越高,處理時(shí)間也就越長(zhǎng)。因此,建議保持標(biāo)準(zhǔn)化設(shè)置為3。膨脹函數(shù)中的“None”參數(shù)表示我們的應(yīng)用中不需要元素結(jié)構(gòu)。

關(guān)于膨脹的更多知識(shí),你可以參考:

Image Filtering - OpenCV 2.4.13.7 documentation Functions and classes described in this section are used to perform various linear or non-linear filtering operations…

docs.opencv.org

完成過(guò)濾以后,我們需要在該幀中找到對(duì)象輪廓。我們用當(dāng)前幀中的輪廓來(lái)識(shí)別對(duì)象的大小和位置。為了實(shí)現(xiàn)這一點(diǎn),我們將該幀的一個(gè)副本傳遞到findCounters方法中,使用這個(gè)副本來(lái)查找輪廓。使用副本的原因是,我們不希望輪廓識(shí)別影響到原始過(guò)濾幀。

這里有個(gè)麻煩,因?yàn)槲覀儽仨殞⑤喞鎯?chǔ)在一個(gè)元組中,并且只需要使用該元組的第一個(gè)值。請(qǐng)參閱Python3中聲明元組的語(yǔ)法:(name,_)。

現(xiàn)在,我們只需要在過(guò)濾層上找到對(duì)象的外部輪廓。對(duì)于我們的用例來(lái)說(shuō),除了極端外部輪廓以外的其他輪廓都是無(wú)用的。因此我們必須使用一些近似方法來(lái)優(yōu)化輪廓的提取過(guò)程。例如使用曲線近似或曲線插值,也可以使用簡(jiǎn)單鏈近似規(guī)則,即壓縮水平、垂直和對(duì)角線線段,只保留其端點(diǎn)。因此,我們能夠很快得到最佳擬合輪廓。

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

第八步:找到輪廓區(qū)域,并在矩形中形成端點(diǎn):

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

實(shí)際上我們并不想捕捉像昆蟲(chóng)這樣的小物體,而是要捕捉像人或動(dòng)物這樣的大物體。因此我們采用輪廓區(qū)域的概念,即跳過(guò)那些面積小于10000像素的對(duì)象。對(duì)于大于此區(qū)域的輪廓,我們將狀態(tài)設(shè)置為1,即檢測(cè)到對(duì)象。

想知道關(guān)于圖像處理中的輪廓,可以參考:

Structural Analysis and Shape Descriptors - OpenCV 2.4.13.7 documentation Draws contours outlines or filled contours. The function draws contour outlines in the image if or fills the area…

docs.opencv.org

現(xiàn)在我們使用boundingRect函數(shù)捕捉輪廓的坐標(biāo)。然后,我們使用這些坐標(biāo)在彩色幀上繪制一個(gè)特定顏色、特定厚度的矩形。此矩形描述了實(shí)際檢測(cè)到的對(duì)象。

第九步:捕獲對(duì)象進(jìn)入幀(場(chǎng)景)和退出幀(場(chǎng)景)時(shí)的時(shí)間戳

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

“狀態(tài)”列表status_list存儲(chǔ)值0:代表未檢測(cè)到對(duì)象,1:代表檢測(cè)到對(duì)象。此狀態(tài)值從0更改為1的時(shí)刻就是對(duì)象進(jìn)入幀的那一時(shí)刻。同樣,此狀態(tài)值從1變?yōu)?的時(shí)刻就是對(duì)象從幀中消失的那一時(shí)刻。因此,我們從狀態(tài)列表的最后兩個(gè)值可以獲得這兩個(gè)切換事件的時(shí)間戳。

第十步:顯示所有不同的畫(huà)面(幀)

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

使用imshow()方法,我們將在一個(gè)獨(dú)立的窗口中顯示每個(gè)幀并進(jìn)行比較。

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

我們使用waitKey函數(shù)來(lái)延遲進(jìn)程,直到按下某個(gè)鍵。在這里,我們使用waitKey(1)從攝像機(jī)獲得連續(xù)的實(shí)時(shí)反饋。想停止拍攝視頻時(shí),只需按鍵盤(pán)上的“Q”鍵即可。

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

我們同時(shí)需要在按下“Q”的同時(shí)捕獲最后一個(gè)時(shí)間戳,因?yàn)檫@將幫助程序結(jié)束從攝像機(jī)捕獲視頻的過(guò)程,并生成時(shí)間數(shù)據(jù)。

下面是使用該應(yīng)用程序生成的實(shí)際圖像輸出。第一個(gè)圖像表示基準(zhǔn)幀的4個(gè)幀類型,第二個(gè)圖像表示帶有對(duì)象的幀的4種類型的幀。你能比較一下區(qū)別嗎?

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器Baseline First Frame

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

Frame with a detected object

第十一步:生成時(shí)間數(shù)據(jù)

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

到目前為止,所有的時(shí)間戳都存儲(chǔ)在pandas的data-frame變量中。為了從生成的數(shù)據(jù)中獲得更多信息,我們將把data-frame變量導(dǎo)出到本地磁盤(pán)的csv文件中。

怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器

請(qǐng)不要忘記釋放視頻變量,因?yàn)樗趦?nèi)存中占用了不少空間。同時(shí)銷毀所有窗口以避免出現(xiàn)不必要的錯(cuò)誤

這就是生成的csv的樣子。正如我們所看到的那樣,在程序結(jié)束之前,這個(gè)對(duì)象已經(jīng)被檢測(cè)了3次。您可以查看開(kāi)始時(shí)間和結(jié)束時(shí)間,并計(jì)算對(duì)象在攝影機(jī)前面的時(shí)間。

這個(gè)應(yīng)用程序還不夠令人興奮嗎?這個(gè)應(yīng)用程序是不是遠(yuǎn)離了典型的無(wú)聊編程?物聯(lián)網(wǎng)愛(ài)好者甚至可以把這個(gè)程序部署到樹(shù)莓派服務(wù)器Raspberry Pi上,并創(chuàng)造奇跡!

以上就是怎樣使用網(wǎng)絡(luò)攝像頭和Python中的OpenCV構(gòu)建運(yùn)動(dòng)檢測(cè)器,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

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

AI