python - 如何用opencv在python中减去两个视频帧

标签 python opencv video

我正在尝试做一些非常简单的事情:从视频中减去背景图像以进行对象跟踪。我知道图像可以简单地从另一个图像中减去,如下所示 img3 = img2 - img1。然而,即使我从一张图片开始,添加一条黑线并将其存储为 img2,img3 也不会只显示这条线。当我运行以下代码时

import cv2
img1 = cv2.imread("img1.png")
img2 = cv2.imread("img2.png")
img3 = img2 - img1
cv2.imwrite("img3.png",img3)

使用波纹管 img1 和 img2:

Img1 Img2

我得到的是下方左侧的图像,而不是右侧的图像: img3 im3wanted

我想用这个方法在视频中提取背景,例如我有一个显示空场景的 bg 图像文件和一个显示同一场景的视频,有时物体会进出屏幕。我使用以下代码,但同样得到一张黑白图像,而不仅仅是在没有场景的情况下可见的对象。

import cv2
import numpy as np
from PIL import Image

capture = cv2.VideoCapture("video.mov")     
while True:
    f, frame = capture.read()
    frame = cv2.GaussianBlur(frame,(15,15),0)
    frame = frame - bg
    cv2.imshow("window", frame)

ps:我知道自动背景减除,但我有非常好的背景文件和非常清晰的空白场景,有非常明显的物体,所以我认为这应该很容易工作!

更新:我刚刚发现了 PIL ImageChops 差异函数,该函数可用于获取我想要的两张图像,但似乎无法用于使用 opencv 打开的视频。也可以使用 numpy 数组手动执行 ImageChops.difference(img1,img2) 吗?

最佳答案

使用此代码可以获得最接近预期的结果:

img3 = 255 - cv2.absdiff(img1,img2)

此代码将为您提供:
enter image description here
请注意,仅使用 cv2.absdiff(img1,img2) 将给出此结果的相反结果,因为基本上此操作会告诉您两张图像之间的区别是什么 - 如果在某些位置没有区别,结果(int this position)是0。
为了获得“完美结果”(正是您所期望的),您需要应用一些阈值(或其他类型的过滤器,它会删除​​图像的左侧部分)。

关于python - 如何用opencv在python中减去两个视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371676/

相关文章:

python - 如何继承Django变量?

python - python pandas通过列名称列表从数据框中选择列

python - 使用 gpu 使用 opencv 测量图像清晰度

c# - 开发具有高质量视频流的视频聊天应用程序

python - 从服务器流式传输大量屏幕截图

python - 如何使用 Python 重新路由网络流量?

python - 如何在 tkinter sqlite3 中重新索引主键

opencv - 如何让 apt-get 忽略 ros-kinetic-opencv3?

image - 识别屏幕截图中所有出现的图像列表(在图像中查找图像)

c# - 使用 NAudio 替换视频的音频流