2015-07-13 3 views
2

Я использую opencv (cv2 module) в python для распознавания объектов в видео. В каждом кадре я хочу извлечь конкретную область aka, контур. После обучения с opencv docs, у меня есть следующий фрагмент кода:Как маскировать видеокадр с использованием контуров с opencv в python

 # np is numpy module, contours are expected results, 
     # frame is each frame of the video 

     # Iterate through the contours. 
     for contour in contours: 
      # Compute the bounding box for the contour, draw 
      # it on the frame, and update the text. 
      x, y, w, h = cv2.boundingRect(contour) 

      # Find the mask and build a histogram for the object. 
      mask = np.zeros(frame.shape[:2], np.uint8) 
      mask[y:h, x:w] = 255 
      masked_img = cv2.bitwise_and(frame, frame, mask = mask) 
      obj_hist = cv2.calcHist([masked_img], [0], None, [256], [0, 256]) 

Однако, когда я использую matplotlib показать masked_img, он возвращает темное изображение. obj_hist имеет только один элемент с номером больше 0, который является первым. Что не так?

+0

Пожалуйста, прочитайте [ask] – boardrider

+0

@boardrider Я его отредактировал, надеюсь, это может помочь вам понять мой вопрос :-) – user4394476

+0

Вы проверили, что 'contours' содержит что-нибудь? –

ответ

2

Проблема заключается в том, как вы устанавливаете значения в маске. В частности эта линия:

mask[y:h, x:w] = 255 

Вы пытаетесь нарежьте каждый размер изображения с помощью y:h и x:w настроить маску. Левая часть двоеточия - это начальная строка или столбец, а справа от двоеточия обозначается строка или столбец конец. Учитывая, что вы начинаете с y, вам необходимо смещение по h с использованием той же ссылки y ... то же самое для x и w.

Выполнение разреза, где правильное значение двоеточия меньше, чем влево, не будет каким-либо образом изменять массив, и именно поэтому вы не получаете никакого вывода, поскольку вы не изменяете маску, когда она изначально все нули.

вероятно Вы имели в виду сделать:

mask[y:y+h, x:x+w] = 255 

Это будет правильно установить соответствующий регион, данное cv2.boundingRect до белого (255).

+1

Это именно то, что я ищу, спасибо вам большое! – user4394476

+0

@ user4394476 - Мое удовольствие :) удачи! – rayryeng

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