Как определить расстояние (искаженной) прямоугольной цели от камеры

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

Например, пример фотографии может выглядеть примерно так (хотя это, вероятно, очень не соответствует пропорциям):

example image

Я могу найти пиксельные координаты углов любого из прямоугольников на изображении, а также FOV камеры и разрешение. Я также заранее знаю длину и ширину любого прямоугольника, который может быть на изображении (но не тот угол, с которым они обращены к камере). Соотношение длины и ширины каждой прямоугольной цели, которая может быть на изображении, гарантируется как уникальная. Прямоугольники и камера всегда будут параллельны земле.


Что я пробовал:

Я взломал решение, основанное на некотором примере кода, который я нашел в Интернете. Я в основном повторяю каждый прямоугольник и нахожу среднюю длину и высоту пикселя.

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

distance formula

... где actual_height - реальная высота цели в дюймах, IMAGE_HEIGHT - это то, как высокое изображение (в пикселях), pixel_height - средняя высота прямоугольника на изображении (в пикселях), а VERTICAL_FOV - это угол, который камера видит по вертикальной оси в градусах (около 39,75 градусов на моей камере).


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

Кроме того, я не уверен, как изменить формулу так, чтобы она имела дело с прямоугольниками, которые очень искажены от просмотра их под углом. Поскольку мой алгоритм работает, находя пропорцию длины и высоты, он работает нормально для прямоугольников 1 и 2 (которые не слишком искажены), но не работает для прямоугольника 3, так как он очень искажен, полностью отбрасывая коэффициенты ,

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

3
nl ja de
Вы нашли решение?
добавлено автор Alex Black, источник
@Bogdan - да, я ищу расстояние до центра прямоугольника.
добавлено автор Michael0x2a, источник
@Hammer - Это правильно - это хороший способ поставить его. Я указываю координаты четырех углов на основе фактических пикселей, на которых они расположены, на изображении, где (0,0) находится в нижнем левом углу, а верхний правый угол - (IMAGE_LENGTH, IMAGE_HEIGHT)
добавлено автор Michael0x2a, источник
Вы сказали: «Я также заранее знаю длину и ширину любого прямоугольника, который может быть на изображении» означает ли это, что вы можете указать все 4 угла прямоугольника в некоторой системе координат? С другой стороны, вы знаете все о структуре прямоугольника, и вы пытаетесь найти его положение/ориентацию.
добавлено автор Hammer, источник
@ Michael0x2a общее решение таких проблем - использовать алгоритм PnP, например solvePnP в openCV. В основном вы предоставляете очки в 3d вместе с их текущей позицией на вашем изображении. Затем алгоритм возвращает положение вашей камеры (которое легко превратить в положение объекта)
добавлено автор Hammer, источник
Из того, что я понимаю, два края прямоугольника находятся не на одном расстоянии от камеры. Итак, какое расстояние вы хотите вычислить? Один к центру каждого прямоугольника?
добавлено автор Bogdan, источник
Рассмотрите вопросы, связанные с cs, в cs.stackexchange.com .
добавлено автор Realz Slaw, источник

1 ответы

FWIW Я когда-то сделал что-то похожее с треугольниками (полная 6DoF поза, не просто расстояние).

1
добавлено
@ BrianTompsett- 汤 莱恩 Спасибо за предложение. Несмотря на сходство, между этим вопросом и тем, с чем я связан, существует некоторое расстояние. (Они относятся к разным обобщениям одной и той же основной проблемы.) Я сделаю это wiki сообщества, если кто-то захочет их согласовать. Если расстояние слишком велико, мы можем удалить ответ.
добавлено автор Museful, источник
Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - Из обзора
добавлено автор Brian Tompsett - 汤莱恩, источник