2015-10-10 5 views
1

Следующая программа отображает «передний план» полностью черный, а не «кадр». Я также проверил, что все значения в 'frame' равны значениям в 'переднем плане'. Они имеют те же каналы, тип данных и т.д. Я использую Python 2.7.6 и OpenCV версии 2.4.8Вычитание фона из изображения с использованием Opencv в Python

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

ответ

1

Потому что вы говорите OpenCV, чтобы отобразить 64bpc изображение. Вы используете .astype(int), что означает «int64» или «int32» в зависимости от вашей архитектуры. Cast .astype ('uint8'). Максимальная максимальная черта 255 выглядит черной по сравнению с полным 64-битным диапазоном.

Связанные проблемы:

foreground = np.absolute(frame - background) 

Integer опустошения. Выражение frame - background не преобразует автоматически в подписанный тип данных. Для таких вычислений вам нужен другой тип данных (попробуйте float, если производительность не имеет значения) или найдите функцию OpenCV, которая обрабатывает все это для вас.

foreground = foreground >= 0 

Поскольку foreground имеет типа «формат uint8», который никогда не может быть отрицательным, то результат все тот. Просто вставьте некоторые операторы print repr(foreground) для отладки таких проблем.

Смежные вопросы