Python 2.7 在Python中使用Opencv从图像中减去背景

Python 2.7 在Python中使用Opencv从图像中减去背景,python-2.7,opencv,Python 2.7,Opencv,以下程序显示“前景”完全为黑色,而不是“框架”。我还检查了“frame”中的所有值是否与“foreground”中的值相等。 它们具有相同的通道、数据类型等。 我使用的是python 2.7.6和OpenCV 2.4.8版 import cv2 import numpy as np def subtractBackground(frame,background): foreground = np.absolute(frame - background)

以下程序显示“前景”完全为黑色,而不是“框架”。我还检查了“frame”中的所有值是否与“foreground”中的值相等。 它们具有相同的通道、数据类型等。 我使用的是python 2.7.6和OpenCV 2.4.8版

import cv2 import numpy as np def subtractBackground(frame,background): foreground = np.absolute(frame - background) foreground = foreground >= 0 foreground = foreground.astype(int) foreground = foreground * frame cv2.imshow("foreground",foreground) return foreground def main(): cap = cv2.VideoCapture(0) dump,background = cap.read() while cap.isOpened(): dump,frame = cap.read() frameCopy = subtractBackground(frame,background) cv2.imshow('Live',frame) k = cv2.waitKey(10) if k == 32: break if __name__ == '__main__': main() 进口cv2 将numpy作为np导入 def背景(帧、背景): 前景=np.绝对(帧-背景) 前景=前景>=0 前台=前台.astype(int) 前景=前景*帧 cv2.imshow(“前景”,前景) 返回前景 def main(): cap=cv2.视频捕获(0) dump,background=cap.read() 而cap.isOpened(): dump,frame=cap.read() frameCopy=减去背景(帧,背景) cv2.imshow(“现场”,画面) k=cv2.等待键(10) 如果k==32: 打破 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main()
因为您告诉OpenCV显示一个64bpc的图像。您可以强制转换
.astype(int)
,这表示“int64”或“int32”,具体取决于您的体系结构。改为Cast.astype('uint8')。与整个64位范围相比,255的最大亮度看起来是黑色的

相关问题:

foreground = np.absolute(frame - background)
整数下溢。表达式
frame-background
不会自动转换为有符号数据类型。对于此类计算,您需要不同的数据类型(如果性能不重要,请尝试浮点),或者找到一个OpenCV函数来为您处理整个过程

foreground = foreground >= 0

因为
前台
的类型为'uint8',它永远不能为负数,所以结果为全负数。只需插入一些
print repr(前台)
语句即可调试此类问题。

您可以使用opencv本身提供的后台子程序。 你可以找到教程。 例如,看看代码

import numpy as np

import cv2
cap = cv2.VideoCapture(0)
fgbg = cv2.createBackgroundSubtractorMOG2()
while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

替换
foreground=np.absolute(帧-背景)

使用
前台=cv2.absdiff(帧、背景)