Как исправить пару стереоизображений с помощью opencv? - PullRequest
0 голосов
/ 20 апреля 2019

Я настроил две камеры и откалибровал их по отдельности, после чего я откалибровал обе с помощью функции stereoCalibrate.Похоже, что калибровка работала нормально, поскольку все возвращаемые ошибки перепроецирования находятся в диапазоне от 0,4 до 0,5.Теперь я хочу вычислить карту глубины из пары стереоизображений.Насколько я мог следовать учебным пособиям, мне сначала нужно исправить свои изображения, затемнить их в градациях серого и передать их StereoBM (или любому другому сопоставителю).

Насколько я понимаю, приведенный ниже код должен исправить и показать два изображения в реальном времени с камер.

... Load calibration matrices

//compute rectification
Mat R1, R2, P1, P2, Q;
stereoRectify(cameraMatrix_left, distortionCoefficients_left,
   cameraMatrix_right, distortionCoefficients_right,
   Size(left_camera.get(CAP_PROP_FRAME_WIDTH),
   left_camera.get(CAP_PROP_FRAME_HEIGHT)),
   R, T, R1, R2, P1, P2, Q, 0, 0.0,
   Size(left_camera.get(CAP_PROP_FRAME_WIDTH),
   left_camera.get(CAP_PROP_FRAME_HEIGHT)));

//compute undistortion
Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix_left, distortionCoefficients_left, R1, P1, Size(left_camera.get(CAP_PROP_FRAME_WIDTH), left_camera.get(CAP_PROP_FRAME_HEIGHT)), CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix_right, distortionCoefficients_right, R2, P2, Size(right_camera.get(CAP_PROP_FRAME_WIDTH), right_camera.get(CAP_PROP_FRAME_HEIGHT)), CV_16SC2, rmap[1][0], rmap[1][1]);

while (true) {
    if (!right_camera.read(capturedFrame_right))
        break;
    if (!left_camera.read(capturedFrame_left))
        break;

    remap(capturedFrame_left, drawFrame_left, rmap[0][0], rmap[0][1], INTER_LINEAR, BORDER_DEFAULT, Scalar());
    remap(capturedFrame_right, drawFrame_right, rmap[1][0], rmap[1][1], INTER_LINEAR, BORDER_DEFAULT, Scalar());

    cvtColor(drawFrame_left, grayScale_left, COLOR_RGB2GRAY);
    cvtColor(drawFrame_right, grayScale_right, COLOR_RGB2GRAY);

    imshow(RIGHT_CAMERA, grayScale_right);
    imshow(LEFT_CAMERA, grayScale_left);
}

Я бы ожидал, что оба изображения будут исправлены, как показано в документацииof StereoRectify .

Однако они просто нет.Существует заметная вертикальная разница между обеими картинками.Что я пропустил?

1 Ответ

0 голосов
/ 29 апреля 2019

Вам необходимо проверить правильность калибровки.Для этой камеры загружена правильная калибровочная матрица, она должна предоставить исправленное изображение с указанным выше кодом.

В Интернете были рекомендации по калибровке стерео.Некоторые из них перечислены здесь.

  1. Конкретное расстояние калибровочного шаблона от камеры не должно иметь большого значения.Калибровка должна выполняться с фиксированным фокусом.
  2. Наличие шахматной доски с большим количеством квадратов полезно, так как есть больше угловых точек для извлечения.Это позволяет нам получить больше 3D-2D точечных соответствий (размер квадрата не должен иметь значения).
  3. Необходимы разные точки обзора и углы.Калибровка определяет параметры фокусного расстояния и искажения методом наименьших квадратов, для которых необходимы различные углы шахматной доски, чтобы получить лучшее решение.
  4. Требуется достаточно широкая граница вокруг калибровочного шаблона.
  5. Aбольшой рисунок лучше подходит для камер с большей базовой линией, поскольку перекрытие стерео меньше.
  6. Некоторые наборы инструментов калибровки требуют, чтобы ввод размеров шахматной доски был либо нечетным числом x четным числом (например, 9x6), либо наоборот (например, 8x7).
  7. Предпочтительно, чтобы шахматная доска покрывала как минимум половину области изображения.
  8. Калибровочный шаблон должен быть перемещен, чтобы охватить все поле зрения камеры, чтобы получить лучшую калибровку.Определение фокусного расстояния и перемещение шахматной доски по углам помогает в определении коэффициентов искажения.
  9. Хорошие условия освещения имеют самое большое значение и часто упускаются из виду.
  10. Некоторые источники говорят, что круги легче локализовать, чем угловые точки, и использование шаблона окружностей может привести к лучшей калибровке.
  11. Изменения влажности могут повлиять на обычную бумагу, которая используется, поскольку она поглощает влагу.Необходимо использовать плотную бумагу, а калибровочный шаблон должен быть напечатан на лазерном принтере и предпочтительно прикреплен к стеклянной подложке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...