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

时间:2015-02-06 17:44:36

标签: python opencv video

我正在尝试做一些非常简单的事情:从视频中减去bg图像以进行对象跟踪。我理解图像可以简单地相互减去,如下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图像文件,显示一个emtpy场景和一个视频,显示相同的场景,有时对象移入和移出屏幕。我使用下面的代码,但同样得到一个B / W图像,而不仅仅是没有场景可见的对象..

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)吗?

1 个答案:

答案 0 :(得分:1)

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

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

此代码将为您提供此信息:
enter image description here
请注意,仅使用cv2.absdiff(img1,img2)将给出此结果的对位,因为基本上此操作会告诉您两个图像之间的区别 - 如果在某个位置没有差异,则结果(int此位置)为0。
实现完美的结果" (正是你所期望的)你需要应用一些阈值处理(或者某种其他类型的滤波器,它会擦除​​图像的左侧部分)。