我有一个带点的二进制图像,我使用OpenCV的goodFeaturesToTrack获得,如Image1所示。
我想在其上放置一个4 * 25点的网格,例如Image2上显示的网格(图像上并非所有点都可见,但它是一个常规的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
答案 0 :(得分:0)
我找到的解决方案效果相对较好,如下:
首先,我创建一个所有正像素的位置索引,只是通过图像。我将这些像素称为角落。
然后我使用此索引计算平均倾斜角度: 对于每个角落,我寻找在某些区域足够接近的其他角落,以定义十字架。我管理,为每个像素找到直接位于其左侧,右侧,顶部和底部的像素。 我使用这个十字来计算倾斜角度,然后使用所有获得的倾斜角度的中值作为我的模型点网格的角度。一旦我有这个角度,我只需使用这个角度和每个角落的位置建立一个桌子。 优化功能测量两个图像上的重合像素数,并返回最佳位置。
这种方式适用于大多数示例,但返回的“最佳位置”必须是其中一个角,这并不意味着它对应于最佳位置...主要是如果网格的左上角缺少角落的云。