使用OpenCV和Python構建運動熱圖視訊

神碼堂發表於2020-10-24

 

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陣列組成,。

此外,在最後,因此,當已經對每個幀執行了先前描述的操作時,顏色對映被應用於遮罩並且遮罩與當前幀合併。

使用OpenCV和Python構建運動熱圖視訊

 

更進一步說,可以製作一個顯示熱圖逐幀衰減的視訊。為了實現這一點,將匯出每個幀,然後再次使用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()

最後結果:

使用OpenCV和Python構建運動熱圖視訊

相關文章