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

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

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

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


person Tubbs    schedule 03.06.2011    source источник
comment
Здесь задействовано больше переменных. Какой угол обзора (фокусное расстояние) используемой камеры? Количество эффективных пикселей в изображении и соотношение сторон. Изображение было обрезано? Это в резком фокусе? (Изменение фокуса немного влияет на угол обзора). Я считаю, что на основе угла зрения, плотности пикселей и расстояния можно выработать формулу. Также обратите внимание, что когда изображение/объект находится близко к камере, даже небольшая разница в расстоянии D может привести к относительно большой разнице в количестве охваченных пикселей.   -  person Raze    schedule 03.06.2011
comment
Обратите внимание, что если сфотографированный объект имеет размеры 8 на 11 футов и является плоским, камера, которая находится на расстоянии 22 фута от центра, будет находиться на расстоянии 23 фута от угла. Сказать, что камера находится на расстоянии 22,3 фута от такого объекта, нереально точно.   -  person MSalters    schedule 03.06.2011
comment
@MSalters: Мне кажется вполне разумным называть что-то вроде расстояния по оси камеры расстоянием и измерять его как можно точнее.   -  person jilles de wit    schedule 03.06.2011
comment
Единственная отсутствующая переменная — это угол обзора. Если вы знаете, что вы можете использовать мой ответ ниже, чтобы вычислить расстояние.   -  person jilles de wit    schedule 03.06.2011


Ответы (3)


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

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

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

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

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

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

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

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

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

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

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

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

Для справки модель камеры-обскуры связывает изображение с координатами 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-точке, Long Quan и Zhongdan Lan

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

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

person ysdx    schedule 03.06.2011

Если вы знаете размер реального объекта и угол зрения камеры, то, предполагая, что вы знаете горизонтальный угол обзора альфа (*), горизонтальное разрешение изображения равно xres, тогда расстояние dw до объекта в середина изображения шириной xp пикселей на изображении и шириной xw метров в реальном мире может быть получена следующим образом (как ваш тригонометрия?):

# Distance in "pixel space" relates to dinstance in the real word 
# (we take half of xres, xw and xp because we use the half angle of view):
(xp/2)/dp = (xw/2)/dw 
dw = ((xw/2)/(xp/2))*dp = (xw/xp)*dp (1)

# we know xp and xw, we're looking for dw, so we need to calculate dp:
# we can do this because we know xres and alpha 
# (remember, tangent = oposite/adjacent):
tan(alpha) = (xres/2)/dp
dp = (xres/2)/tan(alpha) (2)

# combine (1) and (2):
dw = ((xw/xp)*(xres/2))/tan(alpha)
# pretty print:
dw = (xw*xres)/(xp*2*tan(alpha))

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

Ссылка на ваши переменные: dw = D, xw = AW, xp = PW

person jilles de wit    schedule 03.06.2011

Это может быть не полный ответ, но может подтолкнуть вас в правильном направлении. Вы когда-нибудь видели, как НАСА делает это на тех снимках из космоса? То, как у них есть эти крошечные кресты на всех изображениях. Насколько мне известно, именно так они получают четкое представление о глубине и размере объекта. Решение может заключаться в том, чтобы иметь объект, правильный размер и глубину которого вы знаете, на картинке, а затем вычислять другие относительно этого. Вам пора провести небольшое исследование. Если НАСА делает это так, то это стоит проверить.

Я должен сказать, что это один из самых интересных вопросов, которые я когда-либо видел в stackoverflow :D. Я только что заметил, что у вас есть только два тега, прикрепленных к этому вопросу. Добавление чего-то большего в отношении изображений может помочь вам лучше.

person Harindaka    schedule 03.06.2011