как разместить сетку точек в случайном облаке точек

У меня есть бинарное изображение с точками, которое я получил с помощью openCV goodFeaturesToTrack, как показано на Image1.

Изображение 1: Облако точек

Я хотел бы разместить на нем сетку из 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

person Quentin Brzustowski    schedule 05.05.2017    source источник


Ответы (1)


Решение, которое я нашел, которое работает относительно хорошо, заключается в следующем:

Сначала я создаю индекс позиций всех положительных пикселей, просто просматривая изображение. Я буду называть эти пиксели углами.

Затем я использую этот индекс для вычисления среднего угла наклона: для каждого из углов я ищу другие, которые были бы достаточно близки в определенных областях, чтобы определить крест. Мне удается для каждого пикселя найти те, которые находятся непосредственно слева, справа, сверху и снизу от него. Я использую этот крест для вычисления угла наклона, а затем использую медиану всех полученных углов наклона в качестве угла для сетки точек моей модели.

Когда у меня есть этот угол, я просто строю таблицу, используя этот угол и положение каждого угла. Функция оптимизации измеряет количество совпадающих пикселей на обоих изображениях и возвращает наилучшую позицию.

Этот способ отлично работает для большинства примеров, но возвращаемая «лучшая позиция» должна быть одним из углов, что не означает, что она соответствует лучшей позиции... В основном, если верхний левый угол сетки внутри облака углы отсутствуют.

person Quentin Brzustowski    schedule 11.05.2017