利用简单的中值滤波提取视频背景

本文介绍了一种基于中值滤波的视频背景减除方法,通过计算选定帧的中值来获取背景,然后从每帧图像中减去背景,以突出移动物体。使用OpenCV进行代码实现,并展示了良好的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理

  最近在learn opencv上学习简单的图像处理的知识,也算是提前了解一下opencv的基本操作吧。
  基本思想就是利用中值滤波,找到视频帧中的背景,然后用每一帧的图像减去背景即可得到背景中移动的物体了。

代码实现

  代码中用到的视频地址
  代码如下:

import numpy as np
import cv2
import imageio
# Open Video
cap = cv2.VideoCapture('video.mp4')

# Randomly select 25 frames
frameIds = cap.get(cv2.CAP_PROP_FRAME_COUNT) * np.random.uniform(size=25)
print(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# Store selected frames in an array
frames = []
for fid in frameIds:
    cap.set(cv2.CAP_PROP_POS_FRAMES, fid)
    ret, frame = cap.read()
    if ret==True:
        frames.append(frame)

# Calculate the median along the time axis
medianFrame = np.median(frames, axis=0).astype(dtype=np.uint8)

# Display median frame
cv2.imshow('frame', cv2.cvtColor(medianFrame,cv2.COLOR_RGB2GRAY))
# set the frame id as 0
cap.set(cv2.CAP_PROP_POS_FRAMES,0)
gif=[]
while(True):
    try:
        ret,frame=cap.read()
        graymedianFrame=cv2.cvtColor(medianFrame,cv2.COLOR_RGB2GRAY)
        frame=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
        dframe=cv2.absdiff(frame,graymedianFrame)
        th, dframe = cv2.threshold(dframe, 30, 255, cv2.THRESH_BINARY)
        if ret==True:
            cv2.imshow('video',dframe)
            gif.append(dframe)
            cv2.waitKey(20)
        else:
            break
    except:
        imageio.mimsave("demo.gif",gif,"GIF")
cap.release()
cv2.destroyAllWindows()

效果如下:
demo
效果还是挺不错的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值