Моя стерео камера имеет разные разрешения 1280х480, 640х240 и 320х120. (Камера транслирует синхронизированную пару изображений 640х480, вставленных горизонтально, поэтому 1280х480).
Я использовал алгоритм Opencv3 Stereo Calibration в следующем ссылка на сайт откалибровать стереокамеру с разрешением 1280 * 480.
stereoRectify( M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2 );
Mat map11, map12, map21, map22;
initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12);
initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22);
Mat img1r, img2r;
remap(img1, img1r, map11, map12, INTER_LINEAR);
remap(img2, img2r, map21, map22, INTER_LINEAR);
stereoRectify вычисляет матрицу вращения R, матрицу трансляции T между левой и правой камерой. А также он рассчитывает две матрицы вращения R1, R2 и две матрицы проекции P1 P2. Я использовал вывод stereoRectify как вход initUndistortRectifyMap а затем переназначить, чтобы применить проекцию.
Вот переполнение стека ответ, чтобы объяснить, как это сделать.
Теперь у меня есть две матрицы карты ректификации левой карты11, карты12 и карты правой камеры21, карты22.
Но теперь я хочу использовать эти матрицы камер M1 и M2, матрицы искажений D1 и D2 и внешние матрицы R, T, R1, R2, P1 и P2 для выпрямления изображений камеры с более низким разрешением (320×120) каждая. PS Я не калибровал камеру с разрешением 320 * 120 напрямую, потому что изображение слишком маленькое, и алгоритм Opencv не может найти углы шахматной доски для выполнения калибровки.
Я знаю, что «Коэффициенты искажения не зависят от просматриваемой сцены. Таким образом, они также относятся к внутренним параметрам камеры. И они остаются неизменными независимо от разрешения снятого изображения. Если, например, камера была откалибрована на изображениях с разрешением 320 x 240, абсолютно одинаковые коэффициенты искажения могут быть использованы для 640 x 480 изображений с одной и той же камеры, в то время как f_x, f_y, c_x и c_y должны быть соответственно масштабированы «. документация opencv. (Я проверял, и это работает)
Я хочу знать: как я должен изменить матрицы R, T, R1, R2, P1, P2, чтобы сделать переназначение в более низком разрешении от 1280×480 до 320×120 ?.
На самом деле
Я изменяю матрицы P1 и P2, которые являются комбинацией внутренней матрицы камеры и матрицы трансляции камеры.
Я просто делю их на 4 для использования 320×120. Общая формула:
fx ‘= (dimx’ / dimx) * fx
fy ‘= (dimy’ / dimy) * fy
fx ‘- это значение для вашего нового разрешения, fx — это значение, которое у вас уже есть для исходного разрешения, dimx’ — это новое разрешение по оси x, dimx — это исходное. То же относится и к фю.
cx и cy рассчитываются аналогично, поскольку все эти значения выражены в пиксельных координатах.
После долгой игры не только P1
а также P2
должны быть масштабированы, но также M1
а также M2
(в коде ОП).
Помните, что масштабирование — это только две первые диагональные записи левой матрицы масштабирования, и оставьте третью позицию равной 1.