如何将点网格适配到随机点云中

3

我有一张二值图像,上面有点,是使用OpenCV的goodFeaturesToTrack获得的,如图像1所示。

Image1 : 点云图像

我想在这张图像上拟合一个4*25个点的网格,就像图像2上显示的那样(并不是所有的点都在图像上可见,但它是一个正常的4*25个点的矩形)。

Image2 : 模型点阵

我的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
我找到的一个相对有效的解决方案如下:
首先,我通过遍历图像创建所有正像素位置的索引。我将这些像素称为角落。
然后,我使用此索引计算平均倾斜角度: 对于每个角落,我寻找其他在某些区域足够接近以定义十字形的角落。我设法找到直接在其左侧、右侧、顶部和底部的像素。 我使用这个十字形来计算倾斜角度,然后使用所有获得的倾斜角度的中位数作为我的模型点网格的角度。
一旦我有了这个角度,我只需使用这个角度和每个角落的位置构建一个表格。 优化函数测量两个图像上重合像素的数量,并返回最佳位置。
这种方法对大多数示例都有效,但返回的“最佳位置”必须是其中之一角落,这并不意味着它对应于最佳位置……特别是如果云中角落的左上角缺失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接