如何使用opencv在python中减去两个视频帧
我正在尝试做一些非常简单的事情:从视频中减去bg图像以进行对象跟踪。我知道图像可以简单地相互减去,如下所示如何使用opencv在python中减去两个视频帧,python,opencv,video,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)
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:
我得到了下面左边的图像,而不是右边的图像:
我想在视频中使用此方法进行背景提取,例如,我有一个显示emtpy场景的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 difference函数,该函数可以通过两幅图像获得我想要的效果,但似乎无法用于使用opencv打开的视频。还可以使用numpy阵列手动执行ImageChops.difference(img1、img2)吗?使用此代码可以获得最接近预期的结果:
img3 = 255 - cv2.absdiff(img1,img2)
此代码将为您提供以下信息:请注意,仅使用
cv2.absdiff(img1,img2)
将给出此结果的位置,因为基本上此操作会告诉您两个图像之间的差异-如果在某个位置上没有差异,则结果(在此位置)为0。为了达到“完美的效果”(正是您所期望的),您需要应用一些阈值(或其他类型的过滤器,将擦除图像的左侧部分)