Как мне разместить сетку точек на случайном облаке точек
У меня есть двоичное изображение с точками, которое я получил, используя OpenFV goodFeaturesToTrack, как показано на Image1.
Я хотел бы разместить на нем сетку из 4*25 точек, например, как показано на рисунке 2 (не все точки видны на изображении, но это обычный прямоугольник 4*25 точек).
Изображение 2: Модель сетки точек
Сетка моей модели размером 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 ответ
Решение, которое я нашел и которое работает относительно хорошо, заключается в следующем:
Сначала я создаю индекс позиций всех положительных пикселей, просто проходя изображение. Я назову эти пиксели углами.
Затем я использую этот индекс для вычисления среднего угла наклона: для каждого из углов я ищу другие, которые были бы достаточно близки в определенных областях, чтобы определить крест. Мне удается для каждого пикселя найти те, которые находятся непосредственно слева, справа, сверху и снизу от него. Я использую этот крестик, чтобы вычислить угол наклона, а затем использую медиану всех полученных углов наклона в качестве угла для моей модельной сетки точек.
Получив этот угол, я просто строю таблицу, используя этот угол и положение каждого угла. Функция оптимизации измеряет количество совпадающих пикселей на обоих изображениях и возвращает наилучшую позицию.
Этот способ отлично работает для большинства примеров, но возвращаемая "лучшая позиция" должна быть одним из углов, что не означает, что она соответствует наилучшей позиции... В основном, если верхний левый угол сетки в облаке углы отсутствуют.