最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用背景差分器實(shí)現(xiàn)運(yùn)動(dòng)物體檢測(cè)

 更新時(shí)間:2022年02月08日 14:21:37   作者:ReadyGo!!!  
目前,許多運(yùn)動(dòng)檢測(cè)技術(shù)都是基于簡(jiǎn)單的背景差分概念的,因此本文將基于背景差分器(MOG背景差分器和KNN背景差分器)來(lái)實(shí)現(xiàn)運(yùn)動(dòng)物體的檢測(cè),感興趣的可以了解一下

前言

目前,許多運(yùn)動(dòng)檢測(cè)技術(shù)都是基于簡(jiǎn)單的背景差分概念的,即假設(shè)攝像頭(視頻)的曝光和場(chǎng)景中的光照條件是穩(wěn)定的,當(dāng)攝像頭捕捉到新的幀時(shí),我們可以從參考圖像中減去該幀,并取這個(gè)差的絕對(duì)值,以獲得幀中每個(gè)像素位置的運(yùn)動(dòng)測(cè)量值。如果幀的任何區(qū)域與參考圖像有很大的不同,我們就認(rèn)為給定區(qū)域中是一個(gè)運(yùn)動(dòng)物體。

本文主要簡(jiǎn)單介紹基本背景差分器,詳細(xì)介紹MOG背景差分器,KNN背景差分器。

一、基本背景差分器

首先,基本背景差分器可以很好地實(shí)現(xiàn)運(yùn)動(dòng)物體的檢測(cè),代碼實(shí)現(xiàn)參考此鏈接

其特點(diǎn)是:此腳本不會(huì)動(dòng)態(tài)更新背景圖像,即當(dāng)一個(gè)運(yùn)動(dòng)的物體靜止后,此腳本仍然會(huì)標(biāo)記此物體,除非此物體消失在窗口中,甚至當(dāng)攝像頭運(yùn)動(dòng)或者光線變化時(shí),此腳本會(huì)直接標(biāo)記整個(gè)窗口直到程序結(jié)束。

如果我們希望腳本能夠動(dòng)態(tài)的更新背景模型,即當(dāng)運(yùn)動(dòng)物體靜止后,靜止物體會(huì)被納入背景,標(biāo)記會(huì)逐漸消失,這時(shí),我們就可以采用更靈活、更智能的背景差分器(如MOG背景差分器、KNN背景差分器)。

二、MOG背景差分器

OpenCV提供了一個(gè)名為 cv2.BackgroundSubtractor 的類,它有實(shí)現(xiàn)各種背景差分算法的子類。

對(duì)于MOG背景差分器,OpenCV有兩種實(shí)現(xiàn),分別命名為:cv2.BackgroundSubtractorMOG 和 cv2.BackgroundSubtractorMOG2,后者是最新改進(jìn)的實(shí)現(xiàn),增加了對(duì)陰影檢測(cè)的支持,我們將使用它。

流程

1.導(dǎo)入OpenCV,初始化MOG背景差分器,定義erode(腐蝕)、dilate(膨脹)運(yùn)算的核大小

import cv2
 
bg_subtractor = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
 
erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))

初始化函數(shù)中接收一個(gè)參數(shù)detectShadows,將其設(shè)置為T(mén)rue,就會(huì)標(biāo)記出陰影區(qū)域,而不會(huì)標(biāo)記為前景的一部分。

使用腐蝕與膨脹的形態(tài)學(xué)操作是為了抑制一些細(xì)微的振動(dòng)頻率。

2.捕捉攝像頭幀,并使用MOG差分器獲得背景掩膜

cap = cv2.VideoCapture(0)
success, frame = cap.read()
while success:
 
    fg_mask = bg_subtractor.apply(frame)

當(dāng)我們把每一幀傳遞給背景差分器的 apply 方法時(shí),差分器就會(huì)更新它的內(nèi)部背景模型,然后返回一個(gè)掩膜。

其中,前景部分的掩膜是白色(255),陰影部分的掩膜是灰色(127),背景部分的掩膜是黑色(0)

3.然后對(duì)掩膜應(yīng)用閾值來(lái)獲得純黑白圖像,并通過(guò)形態(tài)學(xué)運(yùn)算對(duì)閾值化圖像進(jìn)行平滑處理。

    _, thresh = cv2.threshold(fg_mask, 244, 255, cv2.THRESH_BINARY)
    cv2.erode(thresh, erode_kernel, thresh, iterations=2)
    cv2.dilate(thresh, dilate_kernel, thresh, iterations=2)

(本示例中,我們開(kāi)啟了陰影檢測(cè),但我們?nèi)匀幌氚殃幱罢J(rèn)為是背景,所以對(duì)掩膜應(yīng)用一個(gè)接近白色(244)的閾值)

4.現(xiàn)在,如果我們直接查看閾值化后的圖像,會(huì)發(fā)現(xiàn)運(yùn)動(dòng)物體呈現(xiàn)白色斑點(diǎn),我們想找到白色斑點(diǎn)的輪廓,并在其周?chē)L制輪廓。其中,我們將應(yīng)用一個(gè)基于輪廓面積的閾值,如果輪廓太小,就認(rèn)為它不是真正的運(yùn)動(dòng)物體(或者不使用此閾值),檢測(cè)輪廓與繪制邊框的代碼:

    contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
                                          cv2.CHAIN_APPROX_SIMPLE)
 
    for c in contours:
        if cv2.contourArea(c) > 1000:
            x, y, w, h = cv2.boundingRect(c)
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 0), 2)

5.顯示掩膜圖像/閾值化圖像/檢測(cè)結(jié)果圖像,繼續(xù)讀取幀,直到按下ESC退出。

    cv2.imshow('mog', fg_mask)
    cv2.imshow('thresh', thresh)
    cv2.imshow('detection', frame)
 
    k = cv2.waitKey(30)
    if k == 27:  # Escape
        break
 
    success, frame = cap.read()

代碼編寫(xiě)

import cv2
 
OPENCV_MAJOR_VERSION = int(cv2.__version__.split('.')[0])
 
bg_subtractor = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
 
erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
 
cap = cv2.VideoCapture(0)
success, frame = cap.read()
while success:
 
    fg_mask = bg_subtractor.apply(frame)
 
    _, thresh = cv2.threshold(fg_mask, 244, 255, cv2.THRESH_BINARY)
    cv2.erode(thresh, erode_kernel, thresh, iterations=2)
    cv2.dilate(thresh, dilate_kernel, thresh, iterations=2)
 
    if OPENCV_MAJOR_VERSION >= 4:
        # OpenCV 4 or a later version is being used.
        contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
                                          cv2.CHAIN_APPROX_SIMPLE)
    else:
        # OpenCV 3 or an earlier version is being used.
        # cv2.findContours has an extra return value.
        # The extra return value is the thresholded image, which is
        # unchanged, so we can ignore it.
        _, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
                                             cv2.CHAIN_APPROX_SIMPLE)
 
    for c in contours:
        if cv2.contourArea(c) > 1000:
            x, y, w, h = cv2.boundingRect(c)
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 0), 2)
 
 
    cv2.imshow('mog', fg_mask)
    cv2.imshow('thresh', thresh)
    cv2.imshow('detection', frame)
 
    k = cv2.waitKey(30)
    if k == 27:  # Escape
        break
 
    success, frame = cap.read()
 
cap.release()
cv2.destroyAllWindows()

注意:當(dāng)我們啟用陰影檢測(cè)時(shí),我們可以通過(guò)一個(gè)閾值來(lái)移除掩膜上的陰影和反射部分,從而使得檢測(cè)能夠準(zhǔn)確地框選到實(shí)際運(yùn)動(dòng)物體(本示例)。如果我們禁用陰影檢測(cè),那么倒影或者反射部分可能都會(huì)被框選,從而影響檢測(cè)真正運(yùn)動(dòng)物體的準(zhǔn)確性。

三、KNN背景差分器

通過(guò)修改MOG背景差分腳本的很一小部分代碼,即可使用不同的背景差分算法以及不同的形態(tài)學(xué)參數(shù)。

1.用cv2.createBackgroundSubtractorKNN替換cv2.createBackgroundSubtractorMOG2,就可以使用基于KNN聚類(而不是MOG聚類)的背景差分器:

bg_subtractor = cv2.createBackgroundSubtractorKNN(detectShadows=True)

(注意:KNN背景差分器仍然支持detectShadows參數(shù)與apply方法)

修改完成之后,就可以使用KNN背景差分器了,可見(jiàn)修改量非常少。

2.當(dāng)然,此處我們可以使用稍微好點(diǎn)的適應(yīng)于水平細(xì)長(zhǎng)物體的形態(tài)學(xué)核(本例中檢測(cè)的是運(yùn)動(dòng)的汽車(chē),視頻地址(GitHub,可下載):traffic.flv),并使用此視頻作為輸入

erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 5))
dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (17, 11))
 
cap = cv2.VideoCapture('E:/traffic.flv')

3.最后一個(gè)小細(xì)節(jié),我們將掩膜窗口標(biāo)題從“mog”更改為“knn”

    cv2.imshow('knn', fg_mask)

到此這篇關(guān)于Python使用背景差分器實(shí)現(xiàn)運(yùn)動(dòng)物體檢測(cè)的文章就介紹到這了,更多相關(guān)Python運(yùn)動(dòng)物體檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django實(shí)現(xiàn)組合搜索的方法示例

    Django實(shí)現(xiàn)組合搜索的方法示例

    本篇文章主要介紹了Django實(shí)現(xiàn)組合搜索的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Tensorflow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的詳細(xì)代碼

    Tensorflow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了Tensorflow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • python識(shí)別圖像并提取文字的實(shí)現(xiàn)方法

    python識(shí)別圖像并提取文字的實(shí)現(xiàn)方法

    這篇文章主要介紹了python識(shí)別圖像并提取文字的實(shí)現(xiàn)方法,
    2019-06-06
  • Python定時(shí)執(zhí)行之Timer用法示例

    Python定時(shí)執(zhí)行之Timer用法示例

    這篇文章主要介紹了Python定時(shí)執(zhí)行之Timer用法,實(shí)例分析了Timer模塊的原理及相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • python字符串常規(guī)操作大全

    python字符串常規(guī)操作大全

    這篇文章主要給大家介紹了關(guān)于python字符串常規(guī)操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • python調(diào)用有道智云API實(shí)現(xiàn)文件批量翻譯

    python調(diào)用有道智云API實(shí)現(xiàn)文件批量翻譯

    這篇文章主要介紹了python如何調(diào)用有道智云API實(shí)現(xiàn)文件批量翻譯,幫助大家更好得理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • python屬于軟件嗎

    python屬于軟件嗎

    在本篇內(nèi)容里小編給Python新手整理了關(guān)于python是軟件嗎的相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以閱讀下。
    2020-06-06
  • 1分鐘快速生成用于網(wǎng)頁(yè)內(nèi)容提取的xslt

    1分鐘快速生成用于網(wǎng)頁(yè)內(nèi)容提取的xslt

    這篇文章主要教大家如何1分鐘快速生成用于網(wǎng)頁(yè)內(nèi)容提取的xslt,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 使用Python進(jìn)行Ping測(cè)試的操作指南

    使用Python進(jìn)行Ping測(cè)試的操作指南

    在網(wǎng)絡(luò)工程中,Ping測(cè)試是一種常用的網(wǎng)絡(luò)診斷工具,用于檢查網(wǎng)絡(luò)連接的可達(dá)性和響應(yīng)時(shí)間,隨著Python編程語(yǔ)言的廣泛應(yīng)用,越來(lái)越多的網(wǎng)絡(luò)工程師開(kāi)始使用Python進(jìn)行自動(dòng)化網(wǎng)絡(luò)測(cè)試和管理任務(wù),本篇文章將詳細(xì)介紹如何使用Python進(jìn)行Ping測(cè)試,需要的朋友可以參考下
    2024-06-06
  • Python中魔法參數(shù)?*args?和?**kwargs使用詳細(xì)講解

    Python中魔法參數(shù)?*args?和?**kwargs使用詳細(xì)講解

    這篇文章主要介紹了Python中魔法參數(shù)?*args?和?**kwargs使用的相關(guān)資料,*args和**kwargs是Python中實(shí)現(xiàn)函數(shù)參數(shù)可變性的重要工具,分別用于接受任意數(shù)量的位置參數(shù)和關(guān)鍵字參數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12

最新評(píng)論

商洛市| 绥滨县| 铜陵市| 石河子市| 赫章县| 武川县| 嘉荫县| 平远县| 镇赉县| 黄平县| 平陆县| 措美县| 大埔区| 牡丹江市| 行唐县| 延庆县| 邯郸市| 克山县| 册亨县| 天门市| 溆浦县| 阳信县| 石城县| 星座| 桑日县| 桑植县| 舒城县| 德清县| 龙胜| 金沙县| 隆尧县| 英德市| 游戏| 会泽县| 绩溪县| 朝阳区| 二手房| 辉县市| 南川市| 黑龙江省| 车致|