2015-01-29 3 views
2

Я свежее в Matlab. Я работаю над vision.CascadeObjectDetector на Mat-lab и используется дважды, чтобы узнать два разных объекта (отдельно обученных), скажем E и K из видео. bbox и bbox2 - соответствующие ROI. часть кода в время цикла приводится ниже:Игнорировать определенную область (roi) в изображении при обработке в Matlab

videoFrame=step(videoFileReader); 
bbox=step(letterDetector_E,videoFrame); 
bbox2=step(letterDetector_K,videoFrame); 
C = vertcat(bbox,bbox2); 
videoOut=insertObjectAnnotation(videoFrame, 'rectangle', C, 'E&K'); 
step(videoPlayer, videoOut); 

Я хочу, чтобы игнорировать область обозначаемое BBOX в то время как выяснить bbox2. То есть, ни один объект не должен быть обнаружен из той же части изображения (очевидно, что есть аналогия в обоих типах объектов). Поэтому я хочу маскировать или игнорировать область bbox видеофрагма, в то время как bbox2 назначается с шагом (letterDetector_K, videoFrame) . Формат bbox - [xUpperLeft, yUpperLeft, ширина, height]. Как я могу это сделать.

ответ

1

Это довольно легко сделать. После того, как вы обнаружите первую форму, используйте ограничительную рамку, обнаруженную для первого объекта E, затем вставьте заполненный прямоугольник в этом месте, используя insertShape. Убедитесь, что вы установили Opacity в 1.0, чтобы он не смешивал пиксели с фоном в этом прямоугольнике и не выбирал цвет заполненного прямоугольника, который полностью отличается от объекта, который вы пытаетесь обнаружить. Возможно, выберите черный. Кроме того, я рекомендую вам отключать сглаживание при рисовании прямоугольника, потому что на это требуется больше времени, чтобы нарисовать фигуру с включенным. Сглаживание по существу сглаживает края для любых фигур. Поскольку вы не хотите включать информацию в этот регион, на самом деле нет необходимости в сглаживании и поэтому установите это на false. Это делается с опцией SmoothEdges.

Как только вы закончите заполнять фигуру, используйте эту модифицированную рамку и определите следующий объект K. Таким образом, вам нужно только еще одну строку кода, так что это:

videoFrame=step(videoFileReader);  
bbox=step(letterDetector_E,videoFrame); 

%// NEW - Insert filled rectangle 
videoFrame = insertShape(videoFrame, 'FilledRectangle', bbox, ... 
         'Opacity', 1.0, 'Color', 'black', ... 
         'SmoothEdges', false); 

%// Now detect next shape on modified frame 
bbox2=step(letterDetector_K,videoFrame); 

C = vertcat(bbox,bbox2); 
videoOut=insertObjectAnnotation(videoFrame, 'rectangle', C, 'E&K'); 
step(videoPlayer, videoOut); 

Как insertShape работы является то, что она занимает в изображении (videoFrame в вашем случае), то можно указать FilledRectangle флаг и рамку местоположение, которое точно совпадает с 4-элементным массивом описанным вами способом, а именно x и y верхнего левого угла, за которым следует ширина и высота прямоугольника. Мы разместим заполненный прямоугольник в этом месте. Затем мы указываем дополнительные параметры прямоугольника перед его рисованием, например, устанавливаем непрозрачность в 1.0, черный цвет и сглаживание отключены. Мы выводим модифицированный фрейм с вставленным прямоугольником, где я буду мутировать videoFrame, так что для вашего кода требуется минимальное редактирование. Затем вы можете использовать videoFrame для определения следующей формы.

+1

Спасибо ... Это очень помогает – SREE

+0

Мое удовольствие. Удачи! – rayryeng

+0

Plz ... Еще одна помощь ... Я пытался найти определенные буквы при обнаружении объектов. Теперь моя проблема заключается в том, что я должен извлечь последовательные буквы этого слова. Фактически, он неправильно находит ложные срабатывания. Я хочу этого избежать. Фактические буквы, очевидно, расположены последовательно (по оси х). Есть ли способ сделать это? – SREE

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