2014-11-24 8 views
6

Я хочу рассчитать информацию о глубине из 2 изображений с движущейся камеры. Использование Sensor.TYPE_ROTATION_VECTOR У меня есть кватернионы для обоих изображений, а также относительный кватернейн от Img1 до Img2.Вращающееся изображение из данных датчика ориентации

Img1

enter image description here

q1 = 0.7545 - 0.1137i - 0.2715j - 0.5865k 

Img2

enter image description here

q2 = 0.7706 - 0.2252i - 0.3511j - 0.4817k 

И относительная quaternoin является:

qr = -0.9850 + 0.0072i + 0.1329j - 0.1097k 

То есть, относительная матрица вращательный,

|0.9406 -0.2142 -0.2635 | 
|0.2180 0.9758 -0.0150 | 
|0.2604 -0.0433  0.9645 | 

Является ли это матрица getPerspectiveTransform дает?

Когда я использую эту матрицу вращения 3x3 в warpPerspective, я получаю почти пустое изображение, кроме чего-то в верхнем углу левой руки. (Возможно, ось, вокруг которой вращается изображение, неверна).

enter image description here

Что я делаю неправильно?

Примечание: Там небольшой перевод, а также между 2 изображениями (К сожалению о плохих изображений)

Edit 1: Согласно этому link, для моего Moto G 2-го поколения, я получаю свойственный матрица камеры, как,

K = |-3570 0   1632 | 
    | 0 3554.39 1218.65| 
    | 0  0   1 | 
+0

От этого я до сих пор понимаю, что для этого нужно сделать «исправление изображения». Любые идеи о том, как это сделать с доступной информацией? – harsh

ответ

2

Если я правильно понимаю, у вас есть два изображения, полученные с камеры смартфона, для которого вы знаете (по крайней мере, приблизительно) матрицу Intrinsics и относительное 3D вращение между позами, где й e два изображения, где взяты. Вы также говорите, что между двумя изображениями есть небольшой перевод, что хорошо, потому что вы не смогли бы вычислить глубину иначе.

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

1. Найдите точечные соответствия между двумя изображениями

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

  • Плотные соответствия требует, чтобы исправить изображения, чтобы сделать вычисление послушной, однако это, вероятно, займет много времени, если выполняется на смартфоне.Выпрямление изображения может быть достигнуто либо с помощью откалиброванного метода (который требует знать поворот + перевод между двумя позициями изображений, матрицей внутренней матрицы и коэффициентами искажения камеры) или некалиброванным методом (который требует знать разреженные совпадения точек между двумя изображениями и основной матрицей, которые можно оценить из совпадений).

  • Редкое сопоставление требует совпадения основных признаков (например, SURF или SIFT или более эффективных) между двумя изображениями. Преимущество этого заключается в том, что он более эффективен, чем плотное совпадение, а также более точный.

2. Triangulate соответствующих точки для оценки глубины

триангуляции требуется знать параметры Intrinsics (матрица камеры и коэффициенты искажения) и параметры extrinsics (относительное вращение и перемещение между позами, которые образуют изображения, которые были сделаны).


В вашем случае, предполагая, что ваш родственник вращения и встроенные функции камеры матрицы достаточно точны (в чем я сомневаюсь), вы по-прежнему не хватает перевода и коэффициенты искажения.

Однако вы все же можете применить классический подход для стерео триангуляции, требующий точной калибровки вашей камеры и оценки полной относительной позы (т. Е. Вращения + перевода).

Калибровка вашей камеры позволит вам оценить точную матрицу внутренних характеристик и соответствующие коэффициенты искажения. Это рекомендуется, потому что ваша камера не будет точно такой же, как камеры на других телефонах (даже если это та же модель телефона). См. this tutorial, который показывает методологию, хотя образцы кода находятся в C++ (эквивалент должен существовать для android).

После того, как вы подсчитали точно параметры Intrinsics, один способ оценить полную относительную позу (т.е. поворот и сдвиг) является вычислением фундаментальной матрицы (с использованием функций найденных совпадений между двумя изображениями), а затем вывести матрицу матрицы, и, наконец, разложить существенную матрицу на относительное вращение и перевод. См. this link, в котором формула выведет существенную матрицу из фундаментальной матрицы и this link, в которой объясняется, как вычислить поворот и перевод из основной матрицы.


Кроме того, чтобы ответить на ваш другой вопрос, связанный с warpPerspective, вам нужно будет использовать K.R.inv(K) или K.inv(R).inv(K), в зависимости от изображения вы коробления. Это связано с тем, что R - это 3D-поворот, который не имеет ничего общего с пиксельными координатами.

 Смежные вопросы

  • Нет связанных вопросов^_^