作者 | Roberto Sannazzaro
来源 | Medium
编辑 | 代码医生团队
介绍:
OpenCV(或称为“ 开源计算机视觉”)是英特尔于1999年开发的一个库,主要针对计算机视觉和实时视频操作,它使用C ++编写,但受不同语言(包括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)
要消除诸如风,小鸟儿飞舞或一些鼻涕等少量动作,请threshold与一起使用maxValue。
然后将掩码的结果添加到accum_image数组中,对每一帧执行此操作。结果由accum_image存储视频中发生的每个运动的数组组成。
最后当已经针对每个帧完成了先前描述的操作时,将颜色图应用于掩模,并且掩模与当前帧合并。
从上到下,从左到右:当前帧,当前最终帧,已过滤的当前帧,自应用帧0起具有所有蒙版的帧。
为了使视频逐帧显示热图的发展过程,可以保存每个帧,然后对于每个帧,使用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()
最终结果: