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

Python 如何在随机点云上拟合点网格,python,opencv,image-processing,optimization,model-fitting,Python,Opencv,Image Processing,Optimization,Model Fitting,我用OpenCV的goodFeaturesToTrack获得了一个带点的二值图像,如图1所示 我想在其上安装一个由4*25点组成的网格,如图2所示的on(并非图像上的所有点都可见,但它是一个常规的4*25点矩形) 我的4*25点模型网格参数化为: 1-左上角的位置 2-矩形与地平线的倾斜度 下面的代码显示了构建此类模型的函数 这个问题似乎接近于棋盘转角问题 我想知道如何将我的点云模型拟合到输入图像,并获得云的位置和角度。 我可以很容易地测量两个图像之间的距离(输入图像和模型网格上的图像),但

我用OpenCV的goodFeaturesToTrack获得了一个带点的二值图像,如图1所示

我想在其上安装一个由4*25点组成的网格,如图2所示的on(并非图像上的所有点都可见,但它是一个常规的4*25点矩形)

我的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
def模型网格(位置、角度、形状):
#初始化大小形状的输出图像
表=np.零(形状)
#参数
大小_pan=[32,20]#像素
nb_角=[4,25]
index=np.ndarray([nb_corners[0],nb_corners[1],2],dtype=np.dtype('int16'))
角度=角度*np.pi/180
#表的创建
对于范围内的i(nb_角[0]):
对于范围内的j(nb_角[1]):
索引[i,j,0]=pos[0]+j*int(大小盘[1]*np.sin(角度))+i*int(大小盘[0]*np.cos(角度))
索引[i,j,1]=pos[1]+j*int(大小盘[1]*np.cos(角度))-i*int(大小盘[0]*np.sin(角度))
如果0<索引[i,j,0]<表格形状[0]:
如果0<索引[i,j,1]<表格形状[1]:
表[索引[i,j,0],索引[i,j,1]]=1
返回表

我找到了一个相对有效的解决方案,如下所示:

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

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

一旦我有了这个角度,我就简单地用这个角度和每个角的位置建立一个表格。 优化函数测量两幅图像上重合像素的数量,并返回最佳位置

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