使用OpenCV+Python構建運動熱圖視頻

OpenCV是一個強大的圖像和視頻處理庫,在這篇文章中,我將創建一個運動熱圖,用於檢測運動、以及物體或人的流動方向,在投影公共區域時可以對建築師有所幫助。
使用OpenCV+Python構建運動熱圖視頻
簡介
OpenCV,或(開源計算機視覺)是英特爾於1999年開發的一個庫,主要提供計算機視覺和實時視頻的相關操作,它是用C++編寫的,同時也支持多種其它語言(包括Python)。
工作流程
這個程序是基於一種被稱爲高斯背景差法的技術,這項技術被廣泛應用於用穩定的攝像機檢測運動物體。
背景差法創建一個表示幀(圖像的靜態部分)背景的模板,對於每一幀,它將減去前一幀。
讓我們對該算法的兩個主要步驟進行一個簡要概述:






  • 背景初始化:在第一步中,通過凍結第一幀來計算背景的模型。
  • 更新:在第二步中,下一幀將減去上一幀,如果兩幀之間發生變化(移動),則這些幀的差異將反映出該變化,可以通過應用過濾器來進行提取差異信息。
    以下是背景差法應用於從城市攝像機錄製的短視頻的示例:
    使用OpenCV+Python構建運動熱圖視頻
    代碼
    對於整個項目存儲庫,在此處可以獲取。



  • https://github.com/robertosannazzaro/motion-heatmap-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循環遍歷視頻幀:

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)

第一個if塊檢查該幀是否爲視頻的第一幀,這樣做是爲了初始化背景差法的背景,然後accum_image使用與該幀大小相對應的大小來初始化該數組。

filter = background_subtractor.apply(frame) # remove the background

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

accum_image = cv2.add(accum_image, th1)

color_image_video = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)


爲了消除例如風,小鳥飛行等少量運動,將閾值與maxValue一起應用到遮罩上。
然後將掩碼的結果添加到accum_image數組中,對每個幀執行此操作,結果由用於存儲視頻中發生的每個運動的accum_image數組組成。
此外,在最後,當已經對每個幀執行了先前描述的操作時,顏色映射被應用於遮罩並且遮罩與當前幀合併。
![](https://s4.51cto.com/images/blog/202101/05/e50ec15a3b76fafe9523c1bd549139c2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
更進一步,可以製作一個顯示熱圖逐幀衰減的視頻。爲了實現這一點,將導出每個幀,然後再次使用cv2,通過合併所有幀來生成視頻:

video = cv2.VideoWriter('output.avi', fourcc, 30.0, (width, height))
for image in images:
video.write(cv2.imread(os.path.join(image_folder, image)))

cv2.destroyAllWindows()



**最後結果**
![](https://s4.51cto.com/images/blog/202101/05/e8b705fb251e6a3a407c24d613d859f0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

原文鏈接:https://towardsdatascience.com/build-a-motion-heatmap-videousing-opencv-with-python-fd806e8a2340
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章