【cv::triangulatePoints】其中的投射矩阵P(3x4)是怎么得到的?(内外参数K[R|t]到最终矩阵的变换过程)

1. cv::triangulatePoints

cv::triangulatePoints 是 OpenCV 中用于三角测量的函数,用于从两个视角的图像点计算出对应的三维空间点。这在立体视觉和计算机视觉中非常有用,尤其是在从多视角图像中恢复三维结构时。

函数声明

void cv::triangulatePoints(
    const cv::Mat& projMatrix1,
    const cv::Mat& projMatrix2,
    const cv::Mat& projPoints1,
    const cv::Mat& projPoints2,
    cv::Mat& points4D
);

参数解释

  • projMatrix1: 第一个视角的投影矩阵(3x4),描述了从三维空间到第一视角图像的映射关系。可以通过相机内参和外参来构造。
  • projMatrix2: 第二个视角的投影矩阵(3x4),描述了从三维空间到第二视角图像的映射关系。
  • projPoints1: 第一个视角图像中的点坐标集合,类型通常为 cv::Mat,每个点为一个 2D 坐标。大小为 2xN,N 为点的数量。
  • projPoints2: 第二个视角图像中的点坐标集合,类型与 projPoints1 相同,大小也为 2xN
  • points4D: 输出的四维点集合,类型为 cv::Mat。每个点表示为四维齐次坐标 (X, Y, Z, W),其中 W 通常是 1。大小为 4xN,N 为点的数量。

使用示例

以下是一个使用 cv::triangulatePoints 的示例:

#include <opencv2/opencv.hpp>

int main() {
    // 第一个视角的投影矩阵(示例值)
    cv::Mat projMatrix1 = (cv::Mat_<double>(3, 4) << 
        1000, 0, 320, 0,
        0, 1000, 240, 0,
        0, 0, 1, 0);

    // 第二个视角的投影矩阵(示例值)
    cv::Mat projMatrix2 = (cv::Mat_<double>(3, 4) << 
        1000, 0, 320, -100,
        0, 1000, 240, 0,
        0, 0, 1, 0);

    // 第一个视角中的点
    cv::Mat projPoints1 = (cv::Mat_<double>(2, 2) << 
        100, 150,
        200, 250);

    // 第二个视角中的点
    cv::Mat projPoints2 = (cv::Mat_<double>(2, 2) << 
        110, 160,
        210, 260);

    // 输出的四维点
    cv::Mat points4D;

    // 执行三角测量
    cv::triangulatePoints(projMatrix1, projMatrix2, projPoints1, projPoints2, points4D);

    // 打印三维点
    for (int i = 0; i < points4D.cols; ++i) {
        cv::Mat point = points4D.col(i);
        double X = point.at<double>(0) / point.at<double>(3);
        double Y = point.at<double>(1) / point.at<double>(3);
        double Z = point.at<double>(2) / point.at<double>(3);
        std::cout << "3D Point: (" << X << ", " << Y << ", " << Z << ")\n";
    }

    return 0;
}

使用细节

  • 投影矩阵: projMatrix1projMatrix2 是 3x4 的矩阵,通常由相机的内参矩阵和外参矩阵组合得到。它们表示从三维空间到两个视角图像的映射关系。
  • 点的格式: projPoints1projPoints2 必须是相同大小的点集合,每个点都是二维坐标 (x, y)
  • 四维点: points4D 输出的点是四维齐次坐标,其中最后一维 W 通常是 1。计算实际的三维点坐标时,需要将齐次坐标除以 W

2. 由K[R|t] 得到映射矩阵P

要将相机投影矩阵PPP写成K[R∣t]\mathbf{K}[\mathbf{R} | \mathbf{t}]K[Rt]的形式,并将其变换为一个3×43 \times 43×4的矩阵,我们需要分别处理相机的内参矩阵K\mathbf{K}K和外参矩阵[R∣t][\mathbf{R} | \mathbf{t}][Rt]

1. 相机内参矩阵K\mathbf{K}K

相机内参矩阵K\mathbf{K}K是一个3×33 \times 33×3的矩阵,描述相机的内部参数:

K=[fx0cx0fycy001] \mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K=fx000fy0cxcy1

其中:

  • fxf_xfxfyf_yfy是焦距,单位通常是像素。
  • cxc_xcxcyc_ycy是主点(光心)的坐标。

2. 相机外参矩阵[R∣t][\mathbf{R} | \mathbf{t}][Rt]

相机外参矩阵由旋转矩阵R\mathbf{R}R和平移向量t\mathbf{t}t组成,它是一个3×43 \times 43×4的矩阵:

  • 旋转矩阵R\mathbf{R}R 是一个3×33 \times 33×3的矩阵,用于将三维点从世界坐标系旋转到相机坐标系:

R=[R11R12R13R21R22R23R31R32R33] \mathbf{R} = \begin{bmatrix} R_{11} & R_{12} & R_{13} \\ R_{21} & R_{22} & R_{23} \\ R_{31} & R_{32} & R_{33} \end{bmatrix} R=R11R21R31R12R22R32R13R23R33

  • 平移向量t\mathbf{t}t 是一个3×13 \times 13×1的向量,用于将旋转后的点从世界坐标系平移到相机坐标系:

t=[txtytz] \mathbf{t} = \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix} t=txtytz

  • 组合外参矩阵:将R\mathbf{R}Rt\mathbf{t}t组合为一个3×43 \times 43×4的矩阵:

[R∣t]=[R11R12R13txR21R22R23tyR31R32R33tz] [\mathbf{R} | \mathbf{t}] = \begin{bmatrix} R_{11} & R_{12} & R_{13} & t_x \\ R_{21} & R_{22} & R_{23} & t_y \\ R_{31} & R_{32} & R_{33} & t_z \end{bmatrix} [Rt]=R11R21R31R12R22R32R13R23R33txtytz

3. 组合内参和外参矩阵

相机投影矩阵PPP是内参矩阵K\mathbf{K}K和外参矩阵[R∣t][\mathbf{R} | \mathbf{t}][Rt]的乘积,结果是一个3×43 \times 43×4的矩阵:

P=K[R∣t] \mathbf{P} = \mathbf{K}[\mathbf{R} | \mathbf{t}] P=K[Rt]

将它们进行矩阵乘法:

P=[fx0cx0fycy001][R11R12R13txR21R22R23tyR31R32R33tz] \mathbf{P} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} R_{11} & R_{12} & R_{13} & t_x \\ R_{21} & R_{22} & R_{23} & t_y \\ R_{31} & R_{32} & R_{33} & t_z \end{bmatrix} P=fx000fy0cxcy1R11R21R31R12R22R32R13R23R33txtytz

通过矩阵乘法,可以得到:

P=[fxR11+cxR31fxR12+cxR32fxR13+cxR33fxtx+cxtzfyR21+cyR31fyR22+cyR32fyR23+cyR33fyty+cytzR31R32R33tz] \mathbf{P} = \begin{bmatrix} f_x R_{11} + c_x R_{31} & f_x R_{12} + c_x R_{32} & f_x R_{13} + c_x R_{33} & f_x t_x + c_x t_z \\ f_y R_{21} + c_y R_{31} & f_y R_{22} + c_y R_{32} & f_y R_{23} + c_y R_{33} & f_y t_y + c_y t_z \\ R_{31} & R_{32} & R_{33} & t_z \end{bmatrix} P=fxR11+cxR31fyR21+cyR31R31fxR12+cxR32fyR22+cyR32R32fxR13+cxR33fyR23+cyR33R33fxtx+cxtzfyty+cytztz

解释

  • 第一行:表示在 x 方向的投影,结合了 x 焦距fxf_xfx、主点cxc_xcx,以及旋转和平移的影响。
  • 第二行:表示在 y 方向的投影,结合了 y 焦距fyf_yfy、主点cyc_ycy,以及旋转和平移的影响。
  • 第三行:用于齐次坐标的归一化。

总结

通过内参矩阵和外参矩阵的组合,我们得到了用于描述三维点到二维图像平面投影的投影矩阵P\mathbf{P}P。这个矩阵在多视图几何和计算机视觉的应用中至关重要,特别是在三维重建和相机校准中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值