Как отобразить 2D координаты из изображения магазина на фактические полки магазина? - PullRequest
5 голосов
/ 17 марта 2011

Нам нужно построить модель цеха, в которой мы можем связать пиксельные координаты (x, y) из изображений с камеры с реальными объектами в трехмерном пространстве магазина.Изображения с камеры, которые будут служить источниками для создания такой модели, страдают от искажений типа «рыбий глаз».Следовательно, прямые линии фактически появляются в виде кривых на изображениях с камеры, и стены, кажется, встречаются друг с другом не совсем точно под прямым углом.

Мы подразделяем область на многоугольники.Каждый многоугольник на изображении относится к определенной области, такой как полка, область отображения, счетчик проверки и т. Д. Сопоставляя пиксели, попадающие в каждый многоугольник, мы хотим связать его как принадлежащий полке, соответствующей этой области.

Есть идеи, как это сделать?

Ниже приведен пример изображения магазина с помеченными полигонами:

enter image description here

РЕДАКТИРОВАТЬ: Мы не стремимся выяснить трехмерные координаты, нам просто нужно знать, на какую полку нанесен любой полигон.Поэтому, если пользователь нажимает на многоугольник, мы можем сказать, что он щелкнул по какой полке.

Мы можем управлять вышеописанным для больших полигонов, подобных тем, что показаны на рисунке, но полки от камеры могут быть размером всего в несколько пикселей, поэтому нам нужен какой-то вероятностный результат, говорящий, что еслипользователь щелкнул по (x, y), какова вероятность того, что он пытался щелкнуть по Полке-A, или какова вероятность того, что он пытался щелкнуть по Полке-B и т. д.

По сути, мы ищем функцию вероятности, которая бы возвращала вероятности щелчка на близлежащих объектах, когда на 2D-изображении щелкают маленький многоугольник (или пиксель).

РЕДАКТИРОВАТЬ 2: Одна вещь, которая не очевидна из примера изображения, состоит в том, что размер многоугольника может быть очень маленьким (всего несколько пикселей), а многоугольники, в свою очередь, могут быть очень близко друг к другу.

Кроме того, случай использования заключается в том, что покупатель в магазине выбирает товар с одной из полок.Пользователь приложения нажимает на точку на изображении, с которой он думает, что продукты подобраны.Теперь, поскольку полигоны настолько малы и настолько близки, пользователь может только угадать точную точку захвата, поэтому мы можем только знать, что это может быть любой из 3-4 полигонов, близких к точке щелчка.Таким образом, вопрос заключается в том, как рассчитать вероятности для этих 3-4 полигонов с учетом клика?

Как и предполагалось, расстояние клика от центра многоугольника и его площадь могут быть параметрами при расчете этой вероятности, и мне интересно, есть ли алгоритм для этого.

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

Мы не стремимся выяснить трехмерные координаты, нам просто нужно знать, на какую полку нанесен любой полигон. Поэтому, если пользователь нажимает на многоугольник, мы можем сказать, что он щелкнул по какой полке.

Я предполагаю, что у вас есть отображение от полигона до названия полки. Например, в виде списка пар (полигон, название полки). Вы можете сделать это вручную один раз, если камеры зафиксированы и не двигаются. Тогда ваша проблема только в том, чтобы найти, какому многоугольнику принадлежит точка.

Если вы используете OpenCV, то вы можете использовать его функцию PointPolygonTest. В противном случае вы можете написать аналогичную функцию самостоятельно. См., Например, Алгоритм приведения лучей . Затем просматривайте список, пока не найдете многоугольник, в котором находится точка.

Для дальнейшей оптимизации программы вы можете предварительно рассчитать экстенты полигонов. Экстенты позволяют быстро сказать, когда точка определенно находится , а не внутри многоугольника, и рассматривать только оставшиеся многоугольники. Но с таким количеством полигонов, как у вас на изображении, я бы не стал беспокоиться.

По сути, мы ищем функцию вероятности, которая бы возвращала вероятности щелчка на близлежащих объектах, когда на 2D-изображении щелкают маленький многоугольник (или пиксель).

Просто запустите эксперимент, попробуйте щелкнуть один выделенный пиксель, соберите некоторую статистику о том, где оператор фактически щелкает. Получив это, легко предсказать количество кликов вне объекта и степень их вероятности отклонения.

Без такого эксперимента с точно таким же типом людей, такими же условиями использования и тем же указательным устройством, которое вы собираетесь использовать, вы не сможете точно определить, сколько будет от кликов. Я считаю, что многие люди являются кликерами снайпера, если мышь хороша, и они могут хорошо видеть изображение. Если они вынуждены использовать сенсорный интерфейс или другое указательное устройство, точность может быть ниже.

0 голосов
/ 17 марта 2011

То, что вы хотите - это заполнение пространства, например, Z-Curce или Hilbert-Curve.Кривая заполнения пространства подразделяет плоскость на меньшие плитки и уменьшает сложность 2-мерных измерений до 1-мерных таким образом, чтобы каждая плитка получала новый порядок.Что может быть интересным для вашей проблемы, так это то, что кривая Гильбера пересекает плоскость не в двоичном порядке, а использует серый код, так что каждый фрагмент отличается в 1-битном от других фрагментов.Это позволяет легко определить, нажал ли пользователь на тот или иной объект.

0 голосов
/ 17 марта 2011

Несколько комментариев

  • Рыбий глаз можно исправить, применив к изображению некоторые преобразования, см., Например, эту страницу для некоторых ресурсов, включая panotools

  • , чтобы получить только трехмерные координаты, а изображения с одной камеры недостаточно, необходима дополнительная информация

  • отметка одной и той же точки на двух изображениях одной и той же сцены с разных камер может дать вам полную 3D информацию (вам нужно знать положение каждой камеры относительно друг друга)

  • , если вы ищете инструменты для этого, см. https://superuser.com/questions/30053/is-there-any-free-open-source-software-that-converts-photos-to-3d-models

EDIT
После обновления вопроса, если предположить, что набор полигонов уже существует, и вы хотите устранить ошибки пользователя (или повысить точность), вы можете

  • попытаться угадать желаемый полигон клика, рассчитав расстояние до центра веса полигонов, близких к клику

  • использовать визуальные подсказки (высветить выбранный полигон и потребовать второго нажатия)

  • собирать статистику ошибок и для определенных полигонов требуется проверка

...