首页 > 解决方案 > 如何对占用网格进行下采样?

问题描述

我有一个以行主要形式的向量形式存储的占用网格。假设细胞由它们的数字表示

v = [1, 2, 3, ...... , width * height ]

其中宽度和高度是占用网格的尺寸,如下所示

0  1  2  3  4  5
6  7  8  9  10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
30 31 32 33 34 35

如果我们有一个 6 x 6 的占用网格。

我现在想做的是将 6 x 6 占用网格下采样为 2 x 2(或 3 x 3)占用网格。这样做的方法是分别检查以下几组单元格:

0  1  2 
6  7  8 
12 13 14 

3  4  5
9  10 11
15 16 17

18  19  20
24  25  26
30  31  32

21  22  23
27  28  29
33  34  35

如果单个组中的任何单元格被占用,则下采样网格中的新单元格也将被占用。因此,我获得了以下占用网格,其中单元格 1、2、3、4 的占用率由上面的 4 组单元格确定

1  2
3  4

如何在 C++ 中编写 for 循环来完成上述任意大小的网格?我设法弄清楚的唯一模式是每行第一个元素的索引是 i*width 其中 i 是行号

标签: c++algorithm

解决方案


这里重要的可能是 2D 到 1D 的映射:

idx = x + width * y

有了这个,我们可以继续下采样:

input:
    originalOccupancy[]
    originalWidth, originalHeight
    newWidth, newHeight

int downsampleFactorX = originalWidth / newWidth;
int downsampleFactorY = originalHeight / newHeight;

for(int y = 0; y < newHeight; ++y)
{
    for(int x = 0; x < newWidth; ++x)
    {
        int bool occupied = false;
        //now check all the relevant original cells
        for(int oy = 0; oy < downsampleFactorY; ++oy)
        {
            int originalRowStartIdx = (y * downsampleFactorY + oy) * originalWidth + x * downsampleFactorX;
            for(int ox = 0; ox < downsampleFactorX; ++ox)                
                occupied = occupied || originalOccupancy[originalRowStartIdx + ox];
        }
        newOccupancy[x + y * newWidth] = occupied;
    }
}

推荐阅读