自学内容网 自学内容网

OpenCV相机标定与3D重建(7)鱼眼镜头立体校正的函数stereoRectify()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::fisheye::stereoRectify 是 OpenCV 中用于鱼眼镜头立体校正的函数。该函数计算两个相机之间的校正变换,使得从两个相机拍摄的图像中的对应点在行上对齐。这一步骤对于后续的立体匹配和深度估计非常重要。

函数原型

void cv::fisheye::stereoRectify
(
InputArray K1,
InputArray D1,
InputArray K2,
InputArray D2,
const Size & imageSize,
InputArray R,
InputArray tvec,
OutputArray R1,
OutputArray R2,
OutputArray P1,
OutputArray P2,
OutputArray Q,
int flags,
const Size & newImageSize = Size(),
double balance = 0.0,
double fov_scale = 1.0 
)

参数

  • 参数K1: 第一个相机的内参矩阵。
  • 参数D1: 第一个相机的畸变参数。
  • 参数K2: 第二个相机的内参矩阵。
  • 参数D2: 第二个相机的畸变参数。
  • 参数imageSize: 用于立体标定的图像尺寸。
  • 参数R: 第一和第二个相机坐标系之间的旋转矩阵。
  • 参数tvec: 相机坐标系之间的平移向量。
  • 参数R1: 输出第一个相机的3x3校正变换(旋转矩阵)。
  • 参数R2: 输出第二个相机的3x3校正变换(旋转矩阵)。
  • 参数P1: 在新的(校正后的)坐标系统中,输出第一个相机的3x4投影矩阵。
  • 参数P2: 在新的(校正后的)坐标系统中,输出第二个相机的3x4投影矩阵。
  • 参数Q: 输出4×4的视差到深度映射矩阵(见 reprojectImageTo3D 函数)。
  • 参数flags: 操作标志,可以是0或 fisheye::CALIB_ZERO_DISPARITY。如果设置了该标志,函数将使每个相机的主点在校正后的视图中具有相同的像素坐标。如果没有设置该标志,函数可能仍然会在水平或垂直方向上移动图像(取决于极线的方向),以最大化有用的图像区域。
  • 参数newImageSize: 校正后的新图像分辨率。应将相同的大小传递给 initUndistortRectifyMap(参见OpenCV示例目录中的 stereo_calib.cpp)。当传递 (0,0) 时(默认值),它被设置为原始的 imageSize。将其设置为更大的值可以帮助你保留原始图像中的细节,特别是在存在较大径向畸变的情况下。
  • 参数balance: 设置新的焦距范围在最小焦距和最大焦距之间。平衡值在 [0, 1] 范围内。
  • 参数fov_scale: 新焦距的除数。

代码示例


#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 相机内参矩阵 K1 和 K2
    cv::Mat K1 = (cv::Mat_<double>(3, 3) << 458.654, 0, 367.215, 0, 457.296, 248.375, 0, 0, 1);
    cv::Mat K2 = (cv::Mat_<double>(3, 3) << 458.654, 0, 367.215, 0, 457.296, 248.375, 0, 0, 1);

    // 畸变系数 D1 和 D2
    cv::Mat D1 = (cv::Mat_<double>(1, 4) << 0.0695303, -0.160713, -0.00480225, 0.000911994);
    cv::Mat D2 = (cv::Mat_<double>(1, 4) << 0.0695303, -0.160713, -0.00480225, 0.000911994);

    // 图像尺寸
    cv::Size imageSize(720, 576);

    // 旋转矩阵 R 和平移向量 tvec
    cv::Mat R = (cv::Mat_<double>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 1); // 示例数据
    cv::Mat tvec = (cv::Mat_<double>(3, 1) << 0.1, 0.05, 0.02); // 示例数据

    // 输出的校正旋转矩阵
    cv::Mat R1, R2;

    // 输出的投影矩阵
    cv::Mat P1, P2;

    // 输出的重投影矩阵
    cv::Mat Q;

    // 进行立体校正
    cv::fisheye::stereoRectify(
        K1, D1, K2, D2,
        imageSize, R, tvec,
        R1, R2, P1, P2, Q,
        cv::CALIB_ZERO_DISPARITY,
        imageSize, 0.0, 1.0
    );

    // 打印结果
    std::cout << "R1: " << std::endl << R1 << std::endl;
    std::cout << "R2: " << std::endl << R2 << std::endl;
    std::cout << "P1: " << std::endl << P1 << std::endl;
    std::cout << "P2: " << std::endl << P2 << std::endl;
    std::cout << "Q: " << std::endl << Q << std::endl;

    return 0;
}

运行结果

R1: 
[0.8804509063256238, 0.4402254531628119, 0.1760901812651247;
 -0.4402254531628119, 0.8969404364876068, -0.04122382540495731;
 -0.1760901812651247, -0.04122382540495731, 0.9835104698380172]
R2: 
[0.8804509063256238, 0.4402254531628119, 0.1760901812651247;
 -0.4402254531628119, 0.8969404364876068, -0.04122382540495731;
 -0.1760901812651247, -0.04122382540495731, 0.9835104698380172]
P1: 
[463.3157037596288, 0, 216.7917896240862, 0;
 0, 463.3157037596288, 262.3111277744742, 0;
 0, 0, 1, 0]
P2: 
[463.3157037596288, 0, 216.7917896240862, 52.62254833641767;
 0, 463.3157037596288, 262.3111277744742, 0;
 0, 0, 1, 0]
Q: 
[1, 0, 0, -216.7917896240862;
 0, 1, 0, -262.3111277744742;
 0, 0, 0, 463.3157037596288;
 0, 0, -8.804509063256239, 0]


原文地址:https://blog.csdn.net/jndingxin/article/details/144081847

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!