Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Вы можете посмотреть алгоритмы компьютерного зрения. Если вы знаете объект (его размеры и форму). Ваша основная проблема - проблема оценки позы (то есть найти положение объекта относительно камеры), из этого вы можете найти расстояние. Вы можете посмотреть [1] [2] (например, вы можете найти другие статьи на нем, если вам это интересно) или выполнить поиск ПОЗИТА, 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-Point, Long Quan и Zhongdan Lan

[2] Полный линейный 4-точечный алгоритм определения положения камеры, Lihong Zhi и Jianliang Tang

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

Ответ 2

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

# 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

Ответ 3

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

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