Arhn - архитектура программирования

Преобразование между стереопараметрами MATLAB и калибровкой стерео OpenCV StereoRectify

Я хочу преобразовать структуру MATLAB StereoParameters во внутренние и внешние матрицы для использования в StereoRectify OpenCV.

Если я правильно понял http://docs.opencv.org/2.4/modules/calib3d/doc/camera_dication_and_3d_reconstruction.html и http://mathworks.com/help/vision/ref/stereoparameters-class.html , StereoParameters.CameraParameters1 и StereoParameters.CameraParameters2 хранят внутренние матрицы, а другие элементы StereoParameters — внешние.

Я думаю, что получил это отображение

Внутренности:

  • cameraMatrix1 = StereoParameters.CameraParameters1.IntrinsicMatrix'
  • cameraMatrix2 = StereoParameters.CameraParameters2.IntrinsicMatrix'
  • distCoeffs1 = [stereoParameters.CameraParameters1.RadialDistortion(1:2), стереопараметры.CameraParameters1.TangentialDistortion, стереопараметры.CameraParameters1.RadialDistortion(3)]
  • distCoeffs2 = [stereoParameters.CameraParameters2.RadialDistortion(1:2), стереопараметры.CameraParameters2.TangentialDistortion, стереопараметры.CameraParameters2.RadialDistortion(3)]

Внешние:

  • R = стереопараметры.RotationOfCamera2'
  • T = стереопараметры.TranslationOfCamera2'

Пока это правильно?

Тем не менее, я не вижу, как получить

  • R1 (3x3)
  • R2 (3x3)
  • P1 (3x4)
  • P2 (3x4)
  • Q (4x4)

матрицы из остальных стереопараметров.

Есть ли существующий конвертер, который я могу использовать, и если нет, то какие формулы?


  • Я нашел формулу для Q на stackoverflow.com/a/28317841 . 10.10.2017
  • Я хочу сделать наоборот и преобразовать файлы OpenCV в yml-файлы Matlab. Нашли конверсию? Что угодно может быть полезно в этот момент. 13.09.2018

Ответы:


1

Как вы уже выяснили, обе матрицы камеры должны быть транспонированы из-за разных обозначений в MATLAB.

Внутренняя матрица камеры MATLAB

и OpenCV

Внутренняя матрица камеры OpenCV

То же самое относится к матрице вращения и вектору перемещения между камерами: stereoParams.RotationOfCamera2 и stereoParams.TranslationOfCamera2 необходимо транспонировать, чтобы получить матрицу OpenCV R и T вектор.

(Быстрая проверка: R должно быть близко к единичной матрице, если камеры почти параллельны, а первый элемент T должен соответствовать базовой линии между камерами в миллиметрах.)

Вектор коэффициента искажения OpenCV состоит из двух коэффициентов тангенциального искажения MATLAB, за которыми следуют два коэффициента радиального искажения.

Тем не менее, я смог вычислить правильные R1, R2, P1, P2 и Q, используя (R1, R2, P1, P2, Q, leftROI, rightROI) = cv2.stereoRectify(leftCamMatrix, leftDistCoeffs, rightCamMatrix, rightDistCoeffs, imageSize, R, T, None, None, None, None, None, cv2.CALIB_ZERO_DISPARITY, 0)

Обратите внимание, что по причинам типа данных значения несоответствия, полученные с помощью стереосопоставителя OpenCV, необходимо разделить на 16, а координаты в трехмерном облаке точек, возвращаемые cv2.reprojectImageTo3D, необходимо разделить на 64, чтобы получить значения показателей.

(Быстрая проверка: при захвате координат одного и того же объекта на исправленном левом и правом изображениях координаты y должны быть почти равны, и вы должны иметь возможность вычислить расстояние до объекта в метрах с помощью f*B/(x_right-x_left) /1000, где f — общее фокусное расстояние виртуальной камеры в Q, а B — базовая линия в миллиметрах.)

19.06.2018
  • Спасибо за это, но не могли бы вы рассказать о делении на 16 и делении на 64 элемента этого комментария? Это единственная часть, которую я не понимаю. Спасибо! 03.08.2018
  • Я думаю, что в вашем ответе порядок тангенциального и радиального должен быть обратным. Проверьте это 15.03.2019
  • @RakshitKothari, что ты имеешь в виду? Порядок в параметрах функции R, T, как указано выше? 15.03.2019
  • Вектор коэффициентов искажения OpenCV состоит из двух коэффициентов тангенциального искажения MATLAB, за которыми следуют два коэффициента радиального искажения. Я думаю, вам нужно изменить это утверждение на два радиальных коэффициента, за которыми следуют два тангенциальных коэффициента. 15.03.2019
  • Извините за комментарий к этому ответу, но я попробую ваш ответ, и он отлично работает, за исключением коэффициентов искажения. То, что говорит @RakshitKothari, верно: вектор искажения OpenCV начинается с двух радиальных коэффициентов, за которыми следуют два тангенциальных коэффициента. Вы можете отредактировать этот раздел, чтобы будущие читатели, такие как я, не ошиблись. 01.07.2021

  • 2

    Вы можете использовать функцию stereoRectify в OpenCV для получения R1, R2, P1, P2, Q с учетом cameraMatrix1, cameraMatrix2, distCoeffs1, distCoeffs2, R & T.

    В С++ это было бы

    cv::Mat R1, R2, P1, P2, Q; cv::Rect validRoi[2]; cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imSize, R, T, R1, R2, P1, P2, Q, CV_CALIB_ZERO_DISPARITY, 0, imSize, &validRoi[0], &validRoi[1]);

    Важно отметить, что матрицы cameraMatrix1, cameraMatrix2 и R необходимо транспонировать при их копировании из их аналогов в MATLAB.

    (Я выделил это жирным шрифтом, так как потребовалось 2 дня, чтобы выяснить, почему мое исправление не работало, когда я преобразовал его из MATLAB в C++ OpenCV)

    21.05.2019

    3

    https://stackoverflow.com/a/28317841 дает формулу для матрицы Q:

    формула Q

    Tx – из матрицы T. cx, cy и cx’ – из матриц камер. f — некоторая разумная комбинация их фокусных расстояний x и y.

    Все еще не знаю, как получить P1, P2, R1 и R2. Кто-нибудь?

    20.10.2017
  • что вы подразумеваете под разумным сочетанием? 07.08.2018
  • @kevinkayaks: Например, (fx + fy) / 2. Можете ли вы предложить лучший способ получить f? 09.08.2018
  • Я тоже не уверен. Меня очень интересует дополнительная информация о переходе от Matlab к калибровке cv2, если вы узнали что-то еще. 10.08.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..


    © 2024 arhn.ru, Arhn - архитектура программирования