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

时间:2015-10-10 13:51:52

标签: python-2.7 opencv

以下程序将'foreground'显示为全黑,而不是'frame'。我还检查了'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()

3 个答案:

答案 0 :(得分:2)

因为您告诉OpenCV显示64bpc图像。您根据您的体系结构转换.astype(int),意思是'int64'或'int32'。转而使用.astype('uint8')。与完整的64位范围相比,您的最大亮度为255,看起来是黑色。

相关问题:

foreground = np.absolute(frame - background)

整数下溢。表达式frame - background不会自动转换为签名数据类型。您需要一个不同的数据类型进行此类计算(如果性能无关紧要,请尝试浮动),或找到一个OpenCV函数来处理整个事情。

foreground = foreground >= 0

因为foreground是'uint8'类型,它永远不会是负数,所以结果就是全部。只需插入一些print repr(foreground)语句来调试此类问题。

答案 1 :(得分:0)

您可以使用opencv本身提供的背景辅助拖拉机。 您可以找到教程here。 例如看代码

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()

答案 2 :(得分:0)

替换foreground = np.absolute(frame - background)

带有foreground = cv2.absdiff(frame, background)