首页 > 其他分享 >【三维重建】相机模型以及坐标转换

【三维重建】相机模型以及坐标转换

时间:2022-09-02 21:33:41浏览次数:80  
标签:Eigen double 矩阵 相机 坐标 using 坐标系 三维重建 Matrix

理论内容:立体视觉入门指南(1):坐标系与相机参数
代码出处

练习作业

  1. 世界坐标系到相机坐标系的转换 W2C
  2. 相机坐标系到世界坐标系的转换 C2W
  3. 相机坐标系到图像坐标系的转换 C2I
  4. 世界坐标系到图像坐标系的转换 W2I
  5. 有深度作为参数,图像坐标系到相机坐标系的转换I2C
  6. 有深度作为参数,图像坐标系到世界坐标系的转换I2W

照着代码抄了一下,其中比如RT_转置矩阵,相机坐标系转换到世界坐标系感觉原代码不对,自己按照自己的理解做了更正。


#ifndef SV3D_CAMERA_H
#define SV3D_CAMERA_H

#include "eigen_defs.h"

namespace sv3d
{
    class Camera
    {
    public:
        Mat3 K_;  // 内参矩阵
        Mat3 R_;  // 旋转矩阵
        Vec3 t_;  // 平移矩阵
        Mat34 P_; // 投影矩阵
        Mat3 KI_; // 内参矩阵的逆矩阵
        Mat3 RT_; // 旋转矩阵的转置矩阵

    public:
        inline Camera() = default;
        inline ~Camera() = default;

        // 通过K、R、t来构造相机,注意用了移动语义避免复制操作,传入的参数在执行构造函数后内存销毁
        inline Camera(Mat3 K, Mat3 R, Vec3 t) : K_(std::move(K)), R_(std::move(R)), t_(std::move(t))
        {
            KI_ = K_.inverse();
            RT_ = R_.transpose();
            P_ << K_ * R_, K_ * t_;
        }

        // 相机坐标系转换到世界坐标系
        inline Vec3 TransformPointC2W(const Vec3 &X) const
        {
            return R_.inverse() * (X - t_);
        }

        // 世界坐标系转换到相机坐标系
        inline Vec3 TransformPointW2C(const Vec3 &X) const
        {
            return R_ * X + t_;
        }

        // 相机坐标系转到影像坐标系
        inline Vec2 TransformPointC2I(const Vec3 &X) const
        {
            auto I = Vec3(K_ * X);
            return Vec2(I[0] / I[2], I[1] / I[2]); // 归一化
        }

        // 世界坐标系到影像坐标系
        inline Vec2 TransformPointW2I(const Vec3 &X) const
        {
            return TransformPointC2I(TransformPointW2C(X));
        }

        // 影像坐标系转换到相机坐标系(深度已知 X[2])
        inline Vec3 TransformPointI2C(const Vec3 &X) const
        {
            auto Xt = X;
            Xt[0] *= Xt[2];
            Xt[1] *= Xt[2];
            return KI_ * Xt;
        }

        // 影像坐标系转换到世界坐标系(深度已知:X[2]) 
        inline Vec3 TransformPointI2W(const Vec3 &X) const
        {
            return TransformPointC2W(TransformPointI2C(X));
        }
    }
}

#endif

eigen_defs.h

/* -*-c++-*- StereoV3D - Copyright (C) 2021.
* Author	: Ethan Li<[email protected]>
* https://github.com/ethan-li-coding/StereoV3DCode
*/

#ifndef SV3D_EIGEN_DEFS_H
#define SV3D_EIGEN_DEFS_H

#include <Eigen/Core>
#include <Eigen/Dense>
using namespace Eigen;

namespace sv3d
{
	// 3d 矢量 (double类型)
	using Vec2 = Eigen::Vector2d;
		
	/// 2d 矢量 (float类型)
	using Vec2f = Eigen::Vector2f;
	
	// 3d 矢量 (double类型)
	using Vec3 = Eigen::Vector3d;

	// 3d 矢量 (float类型)
	using Vec3f = Eigen::Vector3f;

	/// 4d 矢量 
	using Vec4 = Eigen::Vector4d;
	
	// 9d 矢量
	using Vec9 = Eigen::Matrix<double, 9, 1>;
	
	// 3x3 矩阵 (double类型)
	using Mat3 = Eigen::Matrix<double, 3, 3>;
		
	// 3x4 矩阵 (double类型)
	using Mat34 = Eigen::Matrix<double, 3, 4>;
	
	// 3x3 矩阵 (double类型)(行主序)
	using RMat3 = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>;

	// 3x4 矩阵 (double类型)
	using RMat34 = Eigen::Matrix<double, 3, 4, Eigen::RowMajor>;

	// 4x4 矩阵 (double类型)
	using Mat4 = Eigen::Matrix<double, 4, 4>;
	
	// 2xN 矩阵 (double类型)
	using Mat2X = Eigen::Matrix<double, 2, Eigen::Dynamic>;
		
	// 3xN 矩阵 (double类型)
	using Mat3X = Eigen::Matrix<double, 3, Eigen::Dynamic>;

	// Nx9 矩阵 (double类型)
	using MatX9 = Eigen::Matrix<double, Eigen::Dynamic, 9>;

	// Nx9 矩阵 (double类型)(行主序)
	using RMatX9 = Eigen::Matrix<double, Eigen::Dynamic, 9, Eigen::RowMajor>;

	// NxM 矩阵 (double类型)
	using MatXX = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>;

	// NxM 矩阵 (double类型)(行主序)
	using RMatXX = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
}

#endif

标签:Eigen,double,矩阵,相机,坐标,using,坐标系,三维重建,Matrix
From: https://www.cnblogs.com/Balcher/p/16651277.html

相关文章

  • Basler相机Bayer格式转Qt RGB888
    无论什么品牌的相机,Bayer转RGB都涉及到插值,因此建议使用官方SDK里的函数进行转换。针对Basler相机,代码如下:voidBaslerCamera::toQImage(CGrabResultPtrptrGrabResult,......
  • 1.3(2) 建立空间直角坐标系和确定点坐标的方法
    \({\color{Red}{欢迎到学科网下载资料学习}}\)【基础过关系列】2022-2023学年高二数学上学期同步知识点剖析精品讲义(人教A版2019)\({\color{Red}{跟贵哥学数学,so\qua......
  • 1.3(1) 空间向量及其运算的坐标表示
    \({\color{Red}{欢迎到学科网下载资料学习}}\)【基础过关系列】2022-2023学年高二数学上学期同步知识点剖析精品讲义(人教A版2019)\({\color{Red}{跟贵哥学数学,so\qua......
  • 如何通过经纬度坐标获取附近的地址信息?
    经纬度是确定每个地点位置的精确坐标,使用坐标描述一个位置,非常准确但是并不直观,面向用户表达并不友好。HMSCore定位服务提供了逆地理编码功能,可以通过纬度获取附近地点的......
  • 坐标转换:4326转3857
    functionWGS84ToMercator(lonlat){constcoord={lat:0,lng:0};constearthRad=6378137.0;//地球半径coord.lat=lonlat.ln......
  • 广义坐标与基本假设
    本文转自:https://zhuanlan.zhihu.com/p/133815204  学习理论力学之前,我们需要忘记之前学过的牛顿力学体系,因为这是两个完全不同的研究力学的方法,牛顿力学最核心的东西应......
  • Android 中如何正确获取 View 坐标位置(看了就懂)
    在我们Android开发过程中经常使用到获取View坐标的方式做相关的逻辑判断,主要是用到一下几种方法:getLeft()、getTop()、getRight()、getBottom()getX()、getY()、......
  • 利用matlab进行双目相机标定
    采集图像命令行窗口输入cameraCalibrator打开相机标定工具箱。单击AddImages后的小三角,选择fromcamera。选择相机,设置相机属性。设置分辨率设置保存路径和拍照......
  • 坐标下降法&块坐标下降法(CD&BCD)
    前言本文简要介绍两种非梯度优化方法:坐标下降法和块坐标下降法。二者用于求解无约束优化问题,属于直接法。我一直没太搞清楚坐标下降和坐标轮换的区别,但感觉应该是一个东......
  • 如何实现工程xyz平面坐标与经纬度坐标互转?
    1.常用的坐标系:WGS84坐标系是国际通用坐标系,也叫地球坐标系,大名鼎鼎的GPS系统就是采用的WGS84坐标系。WGS84坐标系对于具体地方的位置描述可能不如当地坐标系来的准确,但......