Искажите прямую линию с помощью функции искажения "рыбий глаз" и нарисуйте ее правильно на изображении

У меня есть линия в мировых координатах и ​​проецируем ее на изображение (как описано в этом вопросе math.stackexchange). Это приводит к простому уравнению линий в пространстве изображения, поэтому я могу легко напечатать его с OpenCV внутри изображения.

Теперь я хочу проецировать линию в изображение с камеры "рыбий глаз". Поскольку у меня есть соответствующая нелинейная функция искажения, я могу легко искажать точки. Наивным способом теперь является искажение каждой точки из сгенерированной линии с помощью этой функции. Но это привело бы к нескольким отрезкам линии и неустановленным пикселям (которые обычно принадлежали бы искаженной линии).

Интересно, что может быть умным способом получить правильную искаженную линию. Может быть, также необходимо обрабатывать линейную проекцию по-другому? Я мог бы чаще выбирать прямую линию (то есть, используя субпиксельные координаты), но я думаю, что это не гарантирует мне правильного решения.

РЕДАКТИРОВАТЬ:

Моя функция искажения - простой полином

r(a) = k1*a+k2*a^2+k3*a^3+k4*a^4

где a является углом неискаженного падающего луча к оптической оси и r это радиус пикселя в искаженном изображении. Вы можете прочитать больше об этом здесь.

1 ответ

Самое простое решение - увеличить разрешение линии. Если вы добавите больше пикселей (субпиксели лучше), то после искажения изображение получится лучше.

Я думаю, что более правильный путь - обратное отображение. Найдите отображение из каждого пикселя (квадрат, целое число) в искаженном изображении в пиксель (четырехугольник, реальный) в неискаженном изображении. Это обеспечит отсутствие дыр в вашей искаженной линии.

введите описание изображения здесь

Другие вопросы по тегам