Нахождение координат xy полок в плане этажа магазина в г - PullRequest
0 голосов
/ 22 января 2019

Я работаю над следующим: у меня есть макет магазина, пример см. Ниже (не могу добавить реальную вещь по причинам GDPR, но пример должен помочь), на котором у меня есть координаты xy от посетителей (конечно, анонимно)

Store layout

Я уже поместил сетку на картинку, чтобы я мог видеть, какой маршрут они выбирают в магазине. Это отлично работает. начало координат внизу слева, а значения x & y масштабируются от 0 до 100. Все идет нормально. Теперь следующим шагом является определение координат полок, прямоугольников на картинке. Есть ли способ сделать это без необходимости делать это вручную? Реальный макет магазина содержит более 900 полок, или я слишком далеко вытаскиваю лодку?

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

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

ТНХ! JL

1 Ответ

0 голосов
/ 23 января 2019

Один из подходов заключается в выполнении кластеризации черных пикселей изображения. Кластеры являются полками. Если полки параллельны оси, вы можете найти прямоугольники, просто взяв мин / макс в каждом направлении. Это работает довольно хорошо:

The found rectangles

Пример кода (я преобразовал изображение в PNG, так как его легче читать, чем gif):

library(png)
library(dbscan)
library(tidyverse)
library(RColorBrewer)


img <- readPNG("G18JU.png")



is_black <-
  img %>% 
  apply(c(1, 2), sum) %>%  #sum all color channels
  {. < 2.5} %>% # we assume black if the sum is lower than 2.5 (max value is 3)
  which(arr.ind=TRUE) # the indices of the black pixels



clust <- dbscan(is_black, 2) # identify clusters

rects <- 
  as.tibble(is_black) %>% 
  mutate(cluster = clust$cluster) %>% # add cluster information
  group_by(cluster) %>% 
  ## find corner points of rectangles normalized to [0, 1]
  summarise(xleft = max(col) / dim(img)[2],
            ybottom = 1 - min(row) / dim(img)[1],
            xright = min(col) / dim(img)[2],
            ytop = 1 - max(row) / dim(img)[1])

## plot the image and the rectangles
plot(c(0, 1), c(0, 1), type="n")
rasterImage(img, 0, 0, 1, 1)
for (i in seq_len(nrow(rects))) {
  rect(rects$xleft[i], rects$ybottom[i], rects$xright[i], rects$ytop[i],
       border = brewer.pal(nrow(rects), "Paired")[i], lwd = 2)
}

Конечно, этот подход также обнаруживает другие черные линии как «прямоугольники» (например, черная граница). Но я думаю, вы легко можете создать «чистое» изображение.

Редактировать: метод расширения для поиска полок с черной линией

Чтобы расширить метод так, чтобы он мог отделить полки, которые разделяют черную линию:

Сначала определите прямоугольники, как описано выше. Затем извлеките каждый прямоугольник из изображения и вычислите рядные значения. Это дает вам 1d изображение (= линия) для каждого прямоугольника. В этой строке примените порог и кластеризацию, как и раньше. Кластеры теперь являются сегментами черных линий, а среднее значение каждого кластера соответствует вертикальной линии, разделяемой двумя полками. Чтобы найти горизонтальные общие линии, можно применить ту же процедуру, но с использованием столбцов вместо строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...