Как вы оцениваете расстояние (реального мира) объекта на картинке? - PullRequest
17 голосов
/ 03 июня 2011

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

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

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

Ответы [ 3 ]

4 голосов
/ 03 июня 2011

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

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-точечный алгоритм для камерыОпределение позы, Lihong Zhi и Jianliang Tang

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

2 голосов
/ 03 июня 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))

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

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

1 голос
/ 03 июня 2011

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

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

...