OpenCV相机标定与3D重建(21)投影矩阵分解函数decomposeProjectionMatrix()的使用

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

算法描述

将投影矩阵分解为旋转矩阵和相机内参矩阵。

cv::decomposeProjectionMatrix 是 OpenCV 库中的一个函数,用于将投影矩阵(Projection Matrix)分解为相机内参矩阵(Camera Matrix)、旋转矩阵(Rotation Matrix)和平移向量(Translation Vector),以及可选的绕各轴的旋转矩阵和欧拉角。这个函数对于理解相机在三维空间中的位置和姿态非常有用。

函数原型

cpp 复制代码
void cv::decomposeProjectionMatrix
(
	InputArray 	projMatrix,
	OutputArray 	cameraMatrix,
	OutputArray 	rotMatrix,
	OutputArray 	transVect,
	OutputArray 	rotMatrixX = noArray(),
	OutputArray 	rotMatrixY = noArray(),
	OutputArray 	rotMatrixZ = noArray(),
	OutputArray 	eulerAngles = noArray() 
)		

参数

  • 参数projMatrix:3x4 输入投影矩阵P。

  • 参数cameraMatrix:输出 3x3 相机内参矩阵 A = [ f x 0 c x 0 f y c y 0 0 1 ] \textbf A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} A= fx000fy0cxcy1

  • 参数rotMatrix:输出 3x3 外部旋转矩阵R。

  • 参数transVect:输出 4x1 平移向量T。

  • 参数rotMatrixX:可选的绕 x 轴的 3x3 旋转矩阵。

  • 参数rotMatrixY:可选的绕 y 轴的 3x3 旋转矩阵。

  • 参数rotMatrixZ:可选的绕 z 轴的 3x3 旋转矩阵。

  • 参数eulerAngles:可选的包含三个旋转欧拉角(以度为单位)的三元素向量。

该函数计算一个投影矩阵分解为校准矩阵(相机内参矩阵)、旋转矩阵和相机位置。它还可以选择性地返回三个旋转矩阵,每个轴一个,以及三个欧拉角,这些可以在 OpenGL 中使用。注意,总是存在多于一种的绕三个主轴旋转的序列,它们会导致物体相同的朝向,例如见 [243] 。返回的三个旋转矩阵和对应的三个欧拉角只是可能解中的一个。

该函数基于 RQDecomp3x3。

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    // 假设我们已经得到了投影矩阵 P
    cv::Mat projMatrix = ( cv::Mat_< double >( 3, 4 ) << 500, 0, 320, 0, 0, 500, 240, 0, 0, 0, 1, 0 );

    // 创建输出容器
    cv::Mat cameraMatrix;
    cv::Mat rotMatrix;
    cv::Mat transVect;

    // 分解投影矩阵
    cv::decomposeProjectionMatrix( projMatrix, cameraMatrix, rotMatrix, transVect );

    // 打印结果
    std::cout << "Camera Matrix:\n" << cameraMatrix << "\n";
    std::cout << "Rotation Matrix:\n" << rotMatrix << "\n";

    // 归一化平移向量以获得实际的平移向量
    double w = transVect.at< double >( 3 );
    if ( w != 0 )
    {
        transVect /= w;
    }
    std::cout << "Translation Vector:\n" << transVect.rowRange( 0, 3 ) << "\n";  // 只取前3行

    return 0;
}

运行结果

cpp 复制代码
Camera Matrix:
[500, 0, 320;
 0, 500, 240;
 0, 0, 1]
Rotation Matrix:
[1, 0, 0;
 0, 1, 0;
 0, 0, 1]
Translation Vector:
[0;
 0;
 0]
相关推荐
牛奶还是纯的好20 分钟前
双目测距实战5-立体矫正
人工智能·3d
房开民2 小时前
OpenCV C++ 中,访问图像像素三种常用方法
c++·opencv·计算机视觉
学技术的大胜嗷5 小时前
图像归一化:OpenCV 高效映射 [0,255] → [-1,1] 性能实测
图像处理·opencv·计算机视觉
Renderbus瑞云渲染农场6 小时前
跨平台渲染不再难_瑞云渲染跨平台转移+克隆双功能上线,效率升级
3d·图形渲染
xhload3d9 小时前
热力图可视化为何被广泛应用?| 图扑数字孪生
3d·html5·webgl·数字孪生·可视化·热力图·三维建模·轻量化·电力能源·空间热力图
天涯路s11 小时前
OpenCV 高级图像处理
人工智能·opencv·计算机视觉
黑云压城After12 小时前
3D魔方-Css实现方法
前端·css·3d
EQ-雪梨蛋花汤12 小时前
【裸眼3D原理浅析】使用AI生成平面裸眼3D图像——“科幻战士破框而出”的裸眼3D图背后的原理与技巧
平面·3d
AndrewHZ13 小时前
【图像处理基石】图像形态学处理:从基础运算到工业级应用实践
图像处理·python·opencv·算法·计算机视觉·cv·形态学处理
shaominjin12315 小时前
OpenCV 4.1.2 SDK 静态库作用与功能详解
android·c++·人工智能·opencv·计算机视觉·中间件