如何在随机点云上拟合点网格
how do I fit a grid of points on a random point cloud
我有一个带点的二值图像,它是我使用 OpenCV 的 goodFeaturesToTrack 获得的,如图 1 所示。
Image1 : Cloud of points
我想在上面放一个 4*25 点的网格,比如 Image2 上的 on(不是所有点都在图像上可见,但它是一个常规的 4*25 点矩形)。
Image2 : Model grid of points
我的 4*25 点模型网格参数化为:
1 - 左上角的位置
2 - 矩形的倾角 horizon
下面的代码显示了构建此类模型的函数。
这个问题好像是棋盘角问题。
我想知道如何将我的模型点云拟合到输入图像并获得点云的位置和角度。
我可以很容易地测量两个图像之间的距离(输入图像和模型网格上的图像),但我想避免检查图像上的每个像素和角度以找到该距离的最小值。
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
我找到的一个解决方案,效果相对较好,如下所示:
首先,我创建了所有正像素位置的索引,只是遍历图像。我将这些像素称为角。
然后我使用这个索引来计算平均倾斜角:
对于每个角,我寻找在某些区域足够接近的其他角,以定义一个十字。我设法为每个像素找到直接位于其左侧、右侧、顶部和底部的像素。
我用这个十字算出一个倾斜角,然后用所有得到的倾斜角的中值作为我模型点格的角度。
一旦我有了这个角度,我就简单地使用这个角度和每个角的位置构建一个 table。
优化函数测量两个图像上重合像素的数量,以及 returns 最佳位置。
这种方式对大多数例子都适用,但返回的'best position'必须是其中一个角,这并不意味着它对应于最佳位置......主要是如果左上角角落云中的网格丢失。
我有一个带点的二值图像,它是我使用 OpenCV 的 goodFeaturesToTrack 获得的,如图 1 所示。
Image1 : Cloud of points
我想在上面放一个 4*25 点的网格,比如 Image2 上的 on(不是所有点都在图像上可见,但它是一个常规的 4*25 点矩形)。
Image2 : Model grid of points
我的 4*25 点模型网格参数化为: 1 - 左上角的位置 2 - 矩形的倾角 horizon 下面的代码显示了构建此类模型的函数。
这个问题好像是棋盘角问题。
我想知道如何将我的模型点云拟合到输入图像并获得点云的位置和角度。 我可以很容易地测量两个图像之间的距离(输入图像和模型网格上的图像),但我想避免检查图像上的每个像素和角度以找到该距离的最小值。
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
我找到的一个解决方案,效果相对较好,如下所示:
首先,我创建了所有正像素位置的索引,只是遍历图像。我将这些像素称为角。
然后我使用这个索引来计算平均倾斜角: 对于每个角,我寻找在某些区域足够接近的其他角,以定义一个十字。我设法为每个像素找到直接位于其左侧、右侧、顶部和底部的像素。 我用这个十字算出一个倾斜角,然后用所有得到的倾斜角的中值作为我模型点格的角度。
一旦我有了这个角度,我就简单地使用这个角度和每个角的位置构建一个 table。 优化函数测量两个图像上重合像素的数量,以及 returns 最佳位置。
这种方式对大多数例子都适用,但返回的'best position'必须是其中一个角,这并不意味着它对应于最佳位置......主要是如果左上角角落云中的网格丢失。