使用OpenCV+Python構(gòu)建運(yùn)動(dòng)熱圖視頻

OpenCV是一個(gè)強(qiáng)大的圖像和視頻處理庫(kù),在這篇文章中,我將創(chuàng)建一個(gè)運(yùn)動(dòng)熱圖,用于檢測(cè)運(yùn)動(dòng)、以及物體或人的流動(dòng)方向,在投影公共區(qū)域時(shí)可以對(duì)建筑師有所幫助。

簡(jiǎn)介

OpenCV,或(開(kāi)源計(jì)算機(jī)視覺(jué))是英特爾于1999年開(kāi)發(fā)的一個(gè)庫(kù),主要提供計(jì)算機(jī)視覺(jué)和實(shí)時(shí)視頻的相關(guān)操作,它是用C++編寫(xiě)的,同時(shí)也支持多種其它語(yǔ)言(包括Python)。工作流程這個(gè)程序是基于一種被稱(chēng)為高斯背景差法的技術(shù),這項(xiàng)技術(shù)被廣泛應(yīng)用于用穩(wěn)定的攝像機(jī)檢測(cè)運(yùn)動(dòng)物體。背景差法創(chuàng)建一個(gè)表示幀(圖像的靜態(tài)部分)背景的模板,對(duì)于每一幀,它將減去前一幀。讓我們對(duì)該算法的兩個(gè)主要步驟進(jìn)行一個(gè)簡(jiǎn)要概述:背景初始化:在第一步中,通過(guò)凍結(jié)第一幀來(lái)計(jì)算背景的模型。更新:在第二步中,下一幀將減去上一幀,如果兩幀之間發(fā)生變化(移動(dòng)),則這些幀的差異將反映出該變化,可以通過(guò)應(yīng)用過(guò)濾器來(lái)進(jìn)行提取差異信息。以下是背景差法應(yīng)用于從城市攝像機(jī)錄制的短視頻的示例:

代碼對(duì)于整個(gè)項(xiàng)目存儲(chǔ)庫(kù),在此處可以獲取。https://github.com/robertosannazzaro/motion-h(huán)eatmap-opencv/blob/master/README.md代碼首先讀取輸入的視頻文件并初始化所需的一些變量:capture = cv2.VideoCapture('input.mp4')background_subtractor = cv2.bgsegm.createBackgroundSubtractorMOG()length = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))然后,for循環(huán)遍歷視頻幀:for i in range(0, length):

ret, frame = capture.read()

# If first frame if first_iteration_indicator == 1:

first_frame = copy.deepcopy(frame) height, width = frame.shape[:2] accum_image = np.zeros((height, width), np.uint8)

第一個(gè)if塊檢查該幀是否為視頻的第一幀,這樣做是為了初始化背景差法的背景,然后accum_image使用與該幀大小相對(duì)應(yīng)的大小來(lái)初始化該數(shù)組。

filter = background_subtractor.a(chǎn)pply(frame) # remove the background

threshold = 2maxValue = 2ret, th1 = cv2.threshold(filter, threshold, maxValue, cv2.THRESH_BINARY)

accum_image = cv2.a(chǎn)dd(accum_image, th1)

color_image_video = cv2.a(chǎn)pplyColorMap(accum_image, cv2.COLORMAP_HOT)

為了消除例如風(fēng),小鳥(niǎo)飛行等少量運(yùn)動(dòng),將閾值與maxValue一起應(yīng)用到遮罩上。然后將掩碼的結(jié)果添加到accum_image數(shù)組中,對(duì)每個(gè)幀執(zhí)行此操作,結(jié)果由用于存儲(chǔ)視頻中發(fā)生的每個(gè)運(yùn)動(dòng)的accum_image數(shù)組組成。此外,在最后,當(dāng)已經(jīng)對(duì)每個(gè)幀執(zhí)行了先前描述的操作時(shí),顏色映射被應(yīng)用于遮罩并且遮罩與當(dāng)前幀合并。

更進(jìn)一步,可以制作一個(gè)顯示熱圖逐幀衰減的視頻。為了實(shí)現(xiàn)這一點(diǎn),將導(dǎo)出每個(gè)幀,然后再次使用cv2,通過(guò)合并所有幀來(lái)生成視頻:video = cv2.VideoWriter('output.a(chǎn)vi', fourcc, 30.0, (width, height))for image in images: video.write(cv2.imread(os.path.join(image_folder, image)))

cv2.destroyAllWindows()最后結(jié)果

(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書(shū)面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。 )

贊助商
2020-06-10
使用OpenCV+Python構(gòu)建運(yùn)動(dòng)熱圖視頻
OpenCV是一個(gè)強(qiáng)大的圖像和視頻處理庫(kù),在這篇文章中,我將創(chuàng)建一個(gè)運(yùn)動(dòng)熱圖,用于檢測(cè)運(yùn)動(dòng)、以及物體或人的流動(dòng)方向,在投影公共區(qū)域時(shí)可以對(duì)建筑師有所幫助。

長(zhǎng)按掃碼 閱讀全文