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

OpenCV是一個強大的圖像和視頻處理庫,在這篇文章中,我將創建一個運動熱圖,用於檢測運動、一些物體或人的流動方向,以及在投影公共區域時對建築師的幫助。

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

簡介:

OpenCV,或(開源計算機視覺)是英特爾於1999年開發的一個庫,主要是計算機視覺和實時視頻操作,它是用C++編寫的,但受不同的語言(包括Python)支持。

工作流程:

這個程序是基於一種被稱為高斯背景減法的技術。這項技術被廣泛應用於用穩定的攝像機檢測運動物體。

背景減法創建一個表示幀(圖像的靜態部分)背景的蒙版,對於每一幀,它將減去前一幀。

讓我們對該算法如何工作的兩個主要步驟進行一個簡要概述:

  • 背景初始化:在第一步中,通過凍結第一幀來計算背景的模型。
  • 更新:在第二步中,下一幀將從上一幀中減去,因此,如果兩幀之間發生變化(移動),則這些幀的差異將反映出該變化,可以通過應用過濾器來進行市場銷售。

以下是背景遮罩應用於從城市攝像機錄製的短視頻的示例:

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

代碼:

對於整個項目存儲庫,請在此處檢查。

  • https://github.com/robertosannazzaro/motion-heatmap-opencv/blob/master/README.md

代碼首先讀取輸入的視頻文件並初始化所需的一些變量:

<code>

capture

= cv2.VideoCapture(

'input.mp4'

)

background_subtractor

= cv2.bgsegm.createBackgroundSubtractorMOG()

length

= int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) /<code>

然後,for循環遍歷幀開始:

<code>

for

i in range(0, length):

frame = capture.read()

if

first_iteration_indicator == 1:

first_frame

=

copy.deepcopy(frame)

width = frame.shape[:2]

accum_image

=

np.zeros((height, width), np.uint8)

/<code>

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

<code>filter = background_subtractor.apply(frame)   

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)
/<code>

為了消除例如風,小鳥飛行等少量運動,將閾值與maxValue一起應用到遮罩上。

然後將掩碼的結果添加到accum_image數組中,對每個幀執行此操作。結果由用於存儲視頻中發生的每個運動的accum_image數組組成,。

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

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

更進一步說,可以製作一個顯示熱圖逐幀衰減的視頻。為了實現這一點,將導出每個幀,然後再次使用cv2,通過合併所有幀來生成視頻:

<code>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() /<code>

最後結果:

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


分享到:


相關文章: