移动背景减法(OpenCV)

问题描述 投票:2回答:4

你知道有什么来源与背景减去从移动的相机吗?我想写类似的东西。http: /vimeo.com72577177

有很多关于静止背景的移动检测的资料,但我找不到任何移动背景的代码样本。

编辑:我想到了光流,通过检测最大数量的相似向量来去除背景。能不能这么简单?

c++ opencv background-subtraction opticalflow
4个回答
2
投票

这里有两篇关于这个主题的研究文章。

  • Mittal, A. et D. Huttenlocher. 2000,"Scene modeling for wide area surveillance andimage synthesis" in Proceedings of the IEEE Conference on Computer Vision andPattern Recognition (PDF)

  • Hayman, E. et J. Eklundh. 2003,"Statistical background subtraction for a mobile obser-ver",in Proceedings of the IEEE International Conference on Computer Vision. (PDF)


2
投票

这不是背景减法!这是对象跟踪

这个 视频。我想你要找的是这样的东西。它在视频的最后有一些论文参考。搜索那些论文。

你可以在视频中找到算法的来源,在 这个这个 链接

好运!


1
投票

要实现这个视频并不难。因为移动的物体很小,背景是静止的,虽然摄像机是缓慢移动的。

首先,确定连续帧之间的运动矢量。例如,t-1帧中(100,100)处的像素在t帧中移动到(103,102)处,由于背景的大部分部分都是静态的,所以可以确定一个常用的运动矢量来描述大部分像素的运动。

其次,使用RANSAC或其他一些算法,根据运动矢量找到不运动的像素。这些像素代表运动的物体。


1
投票

你提到的链接更像是对象跟踪。但如果你想用opencv来应用移动背景减法,那就容易多了。它的工作原理更像是一个运动跟踪器。

这是代码。

import cv2
import numpy as np

cap = cv2.VideoCapture("input.mp4")
out = cv2.createBackgroundSubtractorMOG2()

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
output = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480), isColor=False)

while(cap.isOpened()):
    ret, frame = cap.read()

    if ret==True:
        frame = cv2.flip(frame,180)

        outmask = out.apply(frame)
        output.write(outmask)

        cv2.imshow('original', frame)
        cv2.imshow('Motion Tracker', outmask)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    else:
        break


output.release()
cap.release()
cv2.destroyAllWindows()

这段代码可以让你在视频文件中应用背景减法并保存起来

© www.soinside.com 2019 - 2024. All rights reserved.