Искажите прямую линию с помощью функции искажения "рыбий глаз" и нарисуйте ее правильно на изображении
У меня есть линия в мировых координатах и проецируем ее на изображение (как описано в этом вопросе math.stackexchange). Это приводит к простому уравнению линий в пространстве изображения, поэтому я могу легко напечатать его с OpenCV внутри изображения.
Теперь я хочу проецировать линию в изображение с камеры "рыбий глаз". Поскольку у меня есть соответствующая нелинейная функция искажения, я могу легко искажать точки. Наивным способом теперь является искажение каждой точки из сгенерированной линии с помощью этой функции. Но это привело бы к нескольким отрезкам линии и неустановленным пикселям (которые обычно принадлежали бы искаженной линии).
Интересно, что может быть умным способом получить правильную искаженную линию. Может быть, также необходимо обрабатывать линейную проекцию по-другому? Я мог бы чаще выбирать прямую линию (то есть, используя субпиксельные координаты), но я думаю, что это не гарантирует мне правильного решения.
РЕДАКТИРОВАТЬ:
Моя функция искажения - простой полином
r(a) = k1*a+k2*a^2+k3*a^3+k4*a^4
где a
является углом неискаженного падающего луча к оптической оси и r
это радиус пикселя в искаженном изображении. Вы можете прочитать больше об этом здесь.
1 ответ
Самое простое решение - увеличить разрешение линии. Если вы добавите больше пикселей (субпиксели лучше), то после искажения изображение получится лучше.
Я думаю, что более правильный путь - обратное отображение. Найдите отображение из каждого пикселя (квадрат, целое число) в искаженном изображении в пиксель (четырехугольник, реальный) в неискаженном изображении. Это обеспечит отсутствие дыр в вашей искаженной линии.