中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

發布時間:2021-10-11 17:06:37 來源:億速云 閱讀:198 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。


運動檢測是指檢測物體相對于周圍環境的位置是否發生了變化。接下來,讓我們一起使用Python實現一個運動檢測器應用程序吧!

該運動檢測器可以完成以下任務:

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

2) 監控孩子在屏幕前的時間

3) 在你的后院發現非法侵入

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

想要實現該運動檢測器程序我們需要具備以下條件:

1)硬件要求:裝有網絡攝像機或任何類型攝像機的計算機。

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

3)附加要求:對運動檢測有一定的興趣。

接下來我們將一步步的完成該應用程序的構建。

首先,我們將通過網絡攝像頭捕獲第一幀,并將它視為基準幀,如下圖所示。通過計算該基準幀中的對象與新幀對象之間的相位差來檢測運動。我們也將得到的結果稱為Delta幀。

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

接下來,我們將使用像素強度來優化Delta幀,優化后的幀稱為閾值幀。并且,我們將應用一些復雜的圖像處理技術,例如陰影消除、擴張輪廓等,以完成在閾值幀上提取對象物體。以下是您要實現的目標:

被探測對象

當這個對象進入幀和退出幀時,我們能夠很容易的捕獲這兩幀的時間戳。因此,將能夠準確的在視頻中找到相關片段。

我們希望小伙伴都能自己實現這個程序,因此我們就不直接嵌入代碼了。

從最基本的安裝開始,我們需要安裝Python3或更高版本,并使用pip安裝pandas和OpenCV這兩個庫。這些工作做好,我們的準備工作就完成了。

第一步:導入需要的庫:

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

在下面的代碼中,我們將會了解到在什么時候需要使用上面涉及到的每一項。

第三步:使用網絡攝像機捕獲視頻幀:

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

在OpenCV中有能夠打開相機并捕獲視頻幀的內置函數。其中輸入參數“0”表示計算機硬件端口號為0的攝像機。如果我們擁有了多個攝像頭或閉路電視等設置,可以通過該參數提供相應的端口號。

第四步:將捕捉到的幀轉換為灰度圖像,并應用高斯模糊去除噪聲:

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

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

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

第五步:捕獲第一個灰度幀

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

第一幀是整個處理過程中的基準幀。通過計算此基準幀與新幀之間特定對象的相位差來檢測運動。在拍攝第一幀時,特定對象相機前不應有任何移動。但是得到的第一幀并不需要后續處理,因此我們可以用continue語句跳過后續過程。

第六步:創建Delta幀和閾值幀

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

現在,我們需要找出第一幀和當前幀之間的區別。因此,我們使用absdiff函數并將得到的結果稱為delta幀。對于我們的用例來說,僅僅找到一個差異是不夠的,所以我們需要定義一個像素閾值,它可以被視為真實的對象。

我們可以選擇30像素作為標準閾值,并將標準閾值的顏色定義為白色(顏色代碼:255). 二元閾值函數THRESH_BINARY返回一個元組值,其中只有第二項([0]是第一項,[1]是第二項)包含生成的閾值幀。二元閾值函數用于處理含有2個離散值的非連續函數:如0或1。如果攝影機前面沒有對象,我們將當前幀的狀態視為0;如果攝影機前面存在對象,則將當前幀的狀態視為1。

更多閾值圖像處理相關知識,請參考:

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

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

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

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

以下是在實時捕獲的幀中發現的一些干擾。因此,為了使這些噪聲最小化,我們需要對圖像進行濾波。在膨脹函數Dilate中,我們可以通過設置迭代次數來設置平滑度。迭代次數越多,平滑度越高,處理時間也就越長。因此,建議保持標準化設置為3。膨脹函數中的“None”參數表示我們的應用中不需要元素結構。

關于膨脹的更多知識,你可以參考:

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

完成過濾以后,我們需要在該幀中找到對象輪廓。我們用當前幀中的輪廓來識別對象的大小和位置。為了實現這一點,我們將該幀的一個副本傳遞到findCounters方法中,使用這個副本來查找輪廓。使用副本的原因是,我們不希望輪廓識別影響到原始過濾幀。

這里有個麻煩,因為我們必須將輪廓存儲在一個元組中,并且只需要使用該元組的第一個值。請參閱Python3中聲明元組的語法:(name,_)。

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

第八步:找到輪廓區域,并在矩形中形成端點:

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

實際上我們并不想捕捉像昆蟲這樣的小物體,而是要捕捉像人或動物這樣的大物體。因此我們采用輪廓區域的概念,即跳過那些面積小于10000像素的對象。對于大于此區域的輪廓,我們將狀態設置為1,即檢測到對象。

想知道關于圖像處理中的輪廓,可以參考:

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

現在我們使用boundingRect函數捕捉輪廓的坐標。然后,我們使用這些坐標在彩色幀上繪制一個特定顏色、特定厚度的矩形。此矩形描述了實際檢測到的對象。

第九步:捕獲對象進入幀(場景)和退出幀(場景)時的時間戳

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

“狀態”列表status_list存儲值0:代表未檢測到對象,1:代表檢測到對象。此狀態值從0更改為1的時刻就是對象進入幀的那一時刻。同樣,此狀態值從1變為0的時刻就是對象從幀中消失的那一時刻。因此,我們從狀態列表的最后兩個值可以獲得這兩個切換事件的時間戳。

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

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

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

我們使用waitKey函數來延遲進程,直到按下某個鍵。在這里,我們使用waitKey(1)從攝像機獲得連續的實時反饋。想停止拍攝視頻時,只需按鍵盤上的“Q”鍵即可。

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

我們同時需要在按下“Q”的同時捕獲最后一個時間戳,因為這將幫助程序結束從攝像機捕獲視頻的過程,并生成時間數據。

下面是使用該應用程序生成的實際圖像輸出。第一個圖像表示基準幀的4個幀類型,第二個圖像表示帶有對象的幀的4種類型的幀。你能比較一下區別嗎?

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器Baseline First Frame

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

Frame with a detected object

第十一步:生成時間數據

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

到目前為止,所有的時間戳都存儲在pandas的data-frame變量中。為了從生成的數據中獲得更多信息,我們將把data-frame變量導出到本地磁盤的csv文件中。

怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器

請不要忘記釋放視頻變量,因為它在內存中占用了不少空間。同時銷毀所有窗口以避免出現不必要的錯誤

這就是生成的csv的樣子。正如我們所看到的那樣,在程序結束之前,這個對象已經被檢測了3次。您可以查看開始時間和結束時間,并計算對象在攝影機前面的時間。

這個應用程序還不夠令人興奮嗎?這個應用程序是不是遠離了典型的無聊編程?物聯網愛好者甚至可以把這個程序部署到樹莓派服務器Raspberry Pi上,并創造奇跡!

以上就是怎樣使用網絡攝像頭和Python中的OpenCV構建運動檢測器,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东明县| 济阳县| 贡嘎县| 迁西县| 衡山县| 屏东市| 金秀| 抚宁县| 丹东市| 霸州市| 长寿区| 安龙县| 城固县| 韶山市| 安福县| 西丰县| 康定县| 盘锦市| 英山县| 宜兰县| 宜章县| 宾川县| 额济纳旗| 澄迈县| 万荣县| 华容县| 南澳县| 嘉峪关市| 东乌| 贵德县| 清涧县| 左贡县| 都匀市| 定结县| 淳化县| 平果县| 云和县| 罗源县| 大庆市| 包头市| 双流县|