如何在随机点云上拟合点网格

时间:2017-05-05 16:30:53

标签: python opencv image-processing optimization model-fitting

我有一个带点的二进制图像,我使用OpenCV的goodFeaturesToTrack获得,如Image1所示。

Image1 : Cloud of points

我想在其上放置一个4 * 25点的网格,例如Image2上显示的网格(图像上并非所有点都可见,但它是一个常规的4 * 25点矩形)。

Image2 : Model grid of points

我的4 * 25点模型网格参数化为:     1 - 左上角的位置     2 - 矩形与地平线的倾斜度 下面的代码显示了构建这样一个模型的函数。

这个问题似乎接近棋盘角落的问题。

我想知道如何使我的模型云点适合输入图像并获得云的位置和角度。 我可以很容易地测量两个图像之间的距离(输入一个和模型网格上的一个),但我想避免检查图像上的每个像素和角度,以找到这个距离的最小值。

def ModelGrid(pos, angle, shape):

    # Initialization of output image of size shape
    table = np.zeros(shape)

    # Parameters 
    size_pan = [32, 20]# Pixels
    nb_corners= [4, 25]
    index = np.ndarray([nb_corners[0], nb_corners[1], 2],dtype=np.dtype('int16'))
    angle = angle*np.pi/180

    # Creation of the table
    for i in range(nb_corners[0]):
        for j in range(nb_corners[1]):
            index[i,j,0] = pos[0] + j*int(size_pan[1]*np.sin(angle)) + i*int(size_pan[0]*np.cos(angle))
            index[i,j,1] = pos[1] + j*int(size_pan[1]*np.cos(angle)) - i*int(size_pan[0]*np.sin(angle))

            if 0 < index[i,j,0] < table.shape[0]:
                if 0 < index[i,j,1] < table.shape[1]:
                    table[index[i,j,0], index[i,j,1]] = 1

    return table

1 个答案:

答案 0 :(得分:0)

我找到的解决方案效果相对较好,如下:

首先,我创建一个所有正像素的位置索引,只是通过图像。我将这些像素称为角落。

然后我使用此索引计算平均倾斜角度: 对于每个角落,我寻找在某些区域足够接近的其他角落,以定义十字架。我管理,为每个像素找到直接位于其左侧,右侧,顶部和底部的像素。 我使用这个十字来计算倾斜角度,然后使用所有获得的倾斜角度的中值作为我的模型点网格的角度。

一旦我有这个角度,我只需使用这个角度和每个角落的位置建立一个桌子。 优化功能测量两个图像上的重合像素数,并返回最佳位置。

这种方式适用于大多数示例,但返回的“最佳位置”必须是其中一个角,这并不意味着它对应于最佳位置...主要是如果网格的左上角缺少角落的云。