2017-01-03 5 views
2

Речь идет о проекте, в котором я отслеживаю людей, идущих по полу с инфракрасной камерой, установленной на потолке. Я получаю «blobs» в виде прямоугольников с информацией x/y/w/h.Алгоритм определения процента перекрытия blob на ячейках сетки

Теперь по существу мне нужно выделить/назначить эти капли для сетки соответственно ячейкам сетки в процентах ... так что в зависимости от того, где капли и какие ячейки они перекрываются, ячейки должны получать процент от 0% до 100 %

Есть ли лучшие практики в отношении того, как подойти к этому? Как связать положение/размер капли с ячейками?

Изображения: Чем темнее клетка, тем больше двоичных объекты (красный) перекрывает

The darker the cell, the more the blob (red) overlaps

+0

Что случилось с вычислением процента ячейки, просто подсчитав количество пикселов blob, лежащих в нем, и разделив их на общее количество пикселов blob? EDIT: теперь я вижу, что ваши «капли» заданы как прямоугольники, но если вы получите их как (x, y, w, h), то они должны быть выровнены по оси прямоугольников, что красная капля на вашей фотографии отсутствует. Что он? –

+0

Конечно, сетка и blob выравниваются по всей оси. Как бы вы подсчитали пиксели blob, которые лежат в ячейке? Я не уверен, в каком языке программирования я могу развернуть, но я читал, что C++, например, имеет такие функции, как intersection() и union() для прямоугольников? – alberto2000

+0

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

ответ

0

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

int[][] grid 
int gridSpacing 
int[][] objectPix 

for(objectPix[][] "x") 
    for(objectPix[] "y") 
     gridSpacing[Math.Floor(x/gridSpacing)][Math.Floor(y/gridSpacing)]++ 

Затем на конечной стадии (если вы хотите процент) пройти через сетку и разделить его значение на общее количество пикселей оп в объекте.

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

Рекурсивный метод только с использованием вершин (в C#):

public void splitRectangle(ref int[][] grid, int gridSpacing, rect curRect) 
    { 
     //if rectangle has verticies in different grid zones, split it 
     if(Math.Floor(curRect.pt.x/gridSpacing) != Math.Floor((curRect.pt.x + curRect.width)/gridSpacing)) 
     { 
      int xDiv = gridSpacing*(Math.Floor(curRect.pt.x/gridSpacing) + 1) - curRect.pt.x; 
      rect split1 = new rect(curRect.pt, xDiv, curRect.height); 
      rect split2 = new rect(new point(curRect.pt.x + xDiv, curRect.pt.y), curRect.width - xDiv, curRect.height); 
      splitRectangle(grid, gridSpacing, split1); 
      splitRectangle(grid, gridSpacing, split2); 
     } 
     else if (Math.Floor(curRect.pt.y/gridSpacing) != Math.Floor((curRect.pt.y + curRect.height)/gridSpacing)) 
     { 
      int yDiv = gridSpacing*(Math.Floor(curRect.pt.y/gridSpacing) + 1) - curRect.pt.y; 
      rect split1 = new rect(curRect.pt, curRect.width, yDiv); 
      rect split2 = new rect(new point(curRect.pt.x, curRect.pt.y+yDiv), curRect.width, curRect.height-yDiv); 
      splitRectangle(grid, gridSpacing, split1); 
      splitRectangle(grid, gridSpacing, split2); 
     } 
     //if rectangle is fully contained within 1 grid zone, then add its area to that gridZone 
     else 
     { 
      grid[Math.Floor(curRect.pt.x/gridSpacing)][Math.Floor(curRect.pt.y/gridSpacing)] += curRect.width * curRect.height; 
     } 
    } 

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

+0

Я нашел это: http://stackoverflow.com/questions/9324339/how-much-do-two-rectangles-overlap - это похоже на ваше предложение? – alberto2000

+0

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

+0

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

0

Лучшим способом было бы рассчитать перекрывающуюся область прямоугольника blob на прямоугольнике сетки, чем разделить что по общей площади прямоугольника сетки. Простой поиск и чтение Google должны помочь вам в правильном направлении при реализации этого, или вы можете использовать какую-то существующую библиотеку физики, если у нее есть метод, который вы ищете.

+0

Вы поняли это? Если не сообщите мне, и я могу помочь вам в случае необходимости. –