0

Я работаю над проектом для определения 3D-местоположения объекта. У меня две камеры установлены в двух углах комнаты, и я получил Фундаментальную матрицу между ними. Эти камеры внутренне откалиброваны. Мои изображения 2592 X 19443D-реконструкция до реального масштаба

К = [1228 0 3267 0 1221 0 0 1]

F = [-1.098e-7 3.50715e-7 -0,000313 2.312e-7 2.72256e -7 4.629e-5 0.000234 -0.00129250 1]

Теперь, как действовать, чтобы при заданной трехмерной точке в пространстве я мог получать точки на изображении, которые соответствуют одному и тому же объекту в комнате , Если я могу получить матрицы правых проекций (с правильной шкалой), я могу использовать их позже в качестве входных данных для функции traingulatePoints OpenCV для получения местоположения объекта.

Я застрял в этом, так как долгое время. Поэтому, пожалуйста, помогите мне.

Спасибо.

+0

Если ваша калибровочная матрица камеры написана в ручном режиме, то есть 'K = [1228 0 3267; 0 1221 538; 0 0 1] 'в нотации Matlab, я думаю, что это очень неудобно. Размер вашего изображения равен «2592 x 1944», и главная точка калибровки камеры, которая обычно находится вблизи середины изображения, находится в позиции '(3267, 538)'. Я думаю, что ваша калибровка камеры неверна ... – who9vy

ответ

0

Извините, что не идет в размере комментариев .. так что @ user2167617 ответ на ваш комментарий. В значительной степени. Несколько указателей: единственные значения должны быть (s, s, 0), поэтому (1.3, 1.05, 0) - довольно хорошее предположение. О R: Технически, это правильно, однако, игнорируя знаки. Вполне возможно, что вы получите матрицу вращения, которая не удовлетворяет деминанту ограничения (R) = 1, а вместо этого -1. В этом случае вы можете умножить его на -1. Как правило, если у вас возникают проблемы с этим подходом, попробуйте определить Essential Matrix с использованием 5-точечного алгоритма (внедренного в самую новую версию OpenCV, вам придется его самостоятельно создать). Масштаб действительно невозможно получить с помощью этих данных. Однако все это зависит от масштаба. Если вы определяете, например, расстояние между камерами, составляющим 1 единицу, тогда все будет измерено в этом устройстве.

+0

Спасибо за ответ. Я нашел матрицу поворота и перевода, предполагая, что z указывает из центра камеры в сторону сцены. Затем я использовал точки триангуляции на совпадающих точках. Когда я нахожу расстояние между двумя точками в реальной сцене, и когда я сравниваю его с расстоянием между теми же точками в триангулированном изображении, можно было найти шкалу. На расстоянии, которое я получаю таким образом, есть небольшая ошибка. Я предполагаю, что это из-за простой линейной триангуляции, которую я сделал без исправления изображения. Надеюсь, я получу хорошие результаты с лучшей триангуляцией. – amoghesturi

+0

Если это сделано, то закройте вопрос, приняв один из ответов. –

0

Может быть, это будет проще использовать cv::reprojectImageTo3D функция? Он даст вам 3D-координаты.

+0

Моя главная задача заключалась в том, чтобы получить проекционные матрицы P1 и P2. Я вижу, что с помощью фундаментальной матрицы F я могу получить только матрицы канонических проекций, но они не соответствуют реальному масштабу. Можете ли вы любезно узнать, как я могу получить P1 и P2, которые хороши для реального масштаба. – amoghesturi

+0

Вот лекция о 3D-реконструкции (http://www.umiacs.umd.edu/~ramani/cmsc828d/lecture28.pdf), и есть глава «Неопределенные проблемы реконструкции», которая говорит нам, что мы не можем вычислить масштаб из 2 Просмотры. –

2

Из того, что я собираю, вы получили фундаментальную матрицу с помощью некоторых средств калибровки? В любом случае, с фундаментальной матрицей (или самой калибровочной установкой) вы можете получить разность позы через разложение матрицы Essential. После этого вы можете использовать совпадающие точки функции (используя экстрактор функций и дескриптор, такой как SURF, BRISK, ...), чтобы определить, какие точки в одном изображении принадлежат одной и той же объектной точке, как и другая точка объекта на другом изображении. С помощью этой информации вы сможете проследить треугольник.

+0

Итак, из основной матрицы я вычислил существенную матрицу, используя E = K2 '* F * K1. Затем моему SVD нужна диагональная матрица, такая как (s, s, 1), но моя диагональная матрица - diag (1,3, 1,05, 0). Я предполагаю, что это достаточно хорошо, а затем найти перевод, используя T = последний столбец U и R может быть U * D * V 'или U * D' * V '.Если я узнаю, какая из этих комбинаций правильная, у меня будет P1 = [I | 0] и P2 = [R | T]. Итак, я читаю, что масштаб - это двусмысленность, которая никогда не может быть определена. Мне нужно знать масштаб, так как я пытаюсь оценить точные 3d координаты объектов. Я в правильном направлении? – amoghesturi

+0

Вы можете применить это ограничение, чтобы диагональная матрица SVD была «diag (1,1,0)», т. Е. Если SVD вашей основной матрицы «E = U * D * V», вы можете установить исправить существенную матрицу 'E'' на' E '= U * diag (1,1,0) * V'', как указано в http://en.wikipedia.org/wiki/Eight-point_algorithm, шаг 3. – who9vy