用于确定网格单元格上的blob重叠百分比的算法

时间:2017-01-03 16:07:37

标签: algorithm math geometry computer-vision

这是一个关于我跟踪人们在地板上行走的项目,其中红外摄像头安装在天花板上。我将'blob'作为带有x / y / w / h信息的矩形。

现在基本上我需要分别将这些blob分配/分配给网格的单元格以百分比...所以取决于blob的位置以及它们重叠的单元格,单元格应该得到0%到100%的百分比

是否有关于如何处理此问题的最佳做法?如何将斑点位置/大小与细胞相关联?

图像:细胞越暗,斑点(红色)重叠越多

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

2 个答案:

答案 0 :(得分: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;
        }
    }

我很快写了这个并没有测试它,但它传达了我认为可以让你做你想要的方法。同样,最后一步将通过网格并将所有单元格除以原始矩形区域,将它们转换为百分比......

答案 1 :(得分:0)

最好的方法是计算网格矩形上blob矩形的重叠区域,而不是将其除以网格矩形的总面积。一个简单的谷歌搜索和阅读应该让你朝着正确的方向实现这个,或者你可以使用某种类型的现有物理库,如果它有你想要的方法。