Как вы оцениваете (реальный world) расстояние до объекта на изображении?

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

Скажите, я иметь изображение, которое было снято на расстоянии 22,3 дюйма от изображения 8,5 x 11. Система правильно определяет это изображение в поле размером 319 пикселей b y 409 пикселей.
Как эффективно соотнести фактическую высоту и ширину (AH и AW) и высоту и ширину пикселя (PH и PW) с расстоянием (D)?

Я предполагаю, что когда я на самом деле воспользуюсь уравнением, PH и PW будут обратно пропорциональны D, а AH и AW являются константами (поскольку распознанный объект всегда будет объектом, ширину и высоту которого пользователь может указать) .

17
задан Peter Mortensen 3 June 2011 в 10:59
поделиться

1 ответ

Не знаю, изменил ли ты свой вопрос в какой-то момент, но мой первый ответ довольно сложный для того, что ты хочешь. Вы, вероятно, можете сделать что-то попроще.

1) Длинное и сложное решение (более общие проблемы)

Сначала вам нужно узнать размер объекта.

Вы можете посмотреть на алгоритмы компьютерного зрения. Если вы знаете объект (его размеры и форму). Ваша главная проблема - это проблема оценки позы (то есть, найти положение объекта относительно камеры), из которого вы можете найти расстояние. Вы можете посмотреть [1] [2] (например, вы можете найти другие статьи по нему, если вам интересно) или выполнить поиск POSIT, SoftPOSIT. Вы можете сформулировать проблему как задачу оптимизации: найти позу, чтобы минимизировать «разницу» между реальным изображением и ожидаемым изображением (проекция объекта с учетом предполагаемой позы). Эта разница обычно является суммой (квадратов) расстояний между каждой точкой Ni изображения и проекцией P (Mi) соответствующей точки Mi объекта (3D) для текущих параметров.

Из этого вы можете извлечь расстояние.

Для этого вам нужно откалибровать вашу камеру (примерно, найдите соотношение между положением пикселя и углом обзора).

Теперь вы, возможно, не захотите делать все это самостоятельно, вы можете использовать библиотеки Computer Vision, такие как OpenCV, Gandalf [3] ...

Теперь вы можете сделать что-то более простое (и приблизительное). Если вы можете найти расстояние изображения между двумя точками на одной «глубине» (Z) от камеры, вы можете связать расстояние изображения d с реальным расстоянием D с помощью: d = a D / Z (где a является параметром камера связана с фокусным расстоянием, количеством пикселей, которые вы можете найти с помощью калибровки камеры)

2) Краткое решение (для вас простая проблема)

Но вот (простая, короткая) ответ: если вы рисуете в плоскости, параллельной «плоскости камеры» (то есть она идеально смотрит в камеру), вы можете использовать:

PH = a AH / Z
PW = a AW / Z

где Z - глубина плоскости изображения и а во внутреннем параметре камеры.

Для справки модель камеры-обскуры соотносит скоординированное изображение m = (u, v) с координированным миром M = (X, Y, Z) с:

m   ~       K       M

[u]   [ au as u0 ] [X]
[v] ~ [    av v0 ] [Y]
[1]   [        1 ] [Z]

[u] = [ au as ] X/Z + u0
[v]   [    av ] Y/Z + v0

где «~» означает «пропорционально «а K - матрица внутренних параметров камеры. Вам необходимо выполнить калибровку камеры, чтобы найти K параметров. Здесь я предположил, что au = av = a и as = 0.

Вы можете восстановить параметр Z из любого из этих уравнений (или взять среднее для обоих). Обратите внимание, что параметр Z - это не расстояние от объекта (которое изменяется в разных точках объекта), а глубина объекта (расстояние между плоскостью камеры и плоскостью объекта). но я думаю, это то, что вы хотите в любом случае.

[1] Линейное N-точечное определение позы камеры, Лонг Цюань и Чжундань Лан

[2] Полный линейный 4-точечный алгоритм для определения позы камеры, Лихонг Чжи и Цзянлян Танг

[3] http://gandalf-library.sourceforge.net/

4
ответ дан 30 November 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: