Подсчет объектов в сетке с помощью OpenCV

#c #opencv

#c #opencv

Вопрос:

Я относительно новичок в OpenCV, и я работаю над проектом, где мне нужно подсчитать количество объектов в сетке. сетка является фоном изображения, и в каждом пространстве либо есть объект, либо его нет; мне нужно посчитать присутствующее число, и я действительно не знаю, с чего начать. Я искал здесь и в других местах, но, похоже, не могу найти то, что ищу. В будущем мне нужно будет отслеживать номера ячеек в сетке, поэтому мне также в конечном итоге понадобится знать, занято ли каждое пространство сетки или пусто. Я не собираюсь заходить так далеко, чтобы просить закодированный пример, но кто-нибудь знает какой-либо источник или учебные пособия для выполнения этой задачи или аналогичного ей? Спасибо за вашу помощь!

Дополнительные сведения: изображения будут поступать со стационарно установленной камеры, объекты имеют относительно однородную форму, но разный размер и цвет.

Ответ №1:

Сначала я бы ответил на несколько вопросов:

  1. Будет ли объект полностью заключен в ячейку сетки? Или это может быть размещено поверх линии сетки? (Другими словами, будет ли объект скрывать линию от камеры?)
  2. Будет ли в одной ячейке больше одного объекта?
  3. Может ли объект занимать более одной ячейки? (тесно связано с вопросом 1)

Учитывая разумные ответы на эти вопросы, я полагаю, что проблему можно разбить на две части: во-первых, определить центры каждого пространства сетки. Чтобы подсчитать объекты, вы можете затем попробовать эту область, чтобы увидеть, есть ли там что-нибудь «не фоновое».

Затем вы можете предположить, что пространство сетки определяется четырьмя сильными, регулярно расположенными угловыми элементами. (Ради обсуждения, я предполагаю, что вы выполнили начальную подготовку изображения по мере необходимости: выравнивание гистограммы, размытие по Гауссу для уменьшения шума и т.д.) Оттуда вы можете попробовать некоторые из методов OpenCV для нахождения углов (Harris corner detector, cvGoodFeaturesToTrack и т.д.). Вероятно, вы можете позаимствовать некоторые методы, найденные в примере поиска квадратов OpenCV (samples/c/square.c). Для этой задачи, вероятно, достаточно предположить, что центр сетки является просто центроидом каждого набора «смежных» (или достаточно близких) углов.

В качестве альтернативы вы могли бы использовать преобразование Хафа для определения основных горизонтальных и вертикальных линий на изображении. Затем вы можете определить точки пересечения, чтобы идентифицировать экстенты каждой ячейки сетки. Эта реализация может быть более сложной, поскольку вывод структуры (или смежности) из «близлежащих» вершин для нахождения центра сетки кажется более сложным.

Комментарии:

1. Как правило, объекты будут в значительной степени, хотя и не всегда полностью, находиться в сетках, но более одного объекта в ячейке будут учитываться только как один объект. Я подумываю о загрузке предварительно настроенного файла с координатами для ROI для каждого квадрата, который не будет перемещаться или менять ориентацию, а затем о различении изображения объектами с интервалами с помощью пустой сетки. Сработает ли это? Кроме того, есть ли способ узнать, насколько заполнена ячейка (какая разница найдена), чтобы я мог установить пороговое значение, чтобы избежать шума или слишком маленьких объектов?

2. априорная информация — это всегда хорошо! Если вы можете быть уверены, что рентабельность инвестиций не изменится, ваша проблема становится совершенно иной. Как вы заметили, затем вы можете «вычесть» пустые значения ROI из наблюдаемого изображения. Я предлагаю определять занятое состояние в процентах (это интуитивно понятно и легко вычисляется). Учитывая вышесказанное, вы знаете количество пикселей в ROI и можете подсчитать количество «освещенных» пикселей (после операции с двоичным порогом).