【计算机视觉】直接线性变换(DLT)求解P矩阵(2 使用SVD分解)(附MATLAB代码)

2023-11-19

引言

之前的帖子已经完成了一种计算直接线性变换的方法,是直接通过矩阵运算来进行的,不过随后得到的结果并不能满足精度要求,如果只是用来作为迭代优化的一个初值的话,对于精度的要求倒也不用那么高。但在查阅资料时又发现了另一种解法,是通过SVD分解来进行的,确实可以得到精度更高的结果。

SVD分解

解释奇异值分解的原理的帖子也有很多,我就不班门弄斧了(主要是我也没怎么弄懂QAQ)
这里贴两个链接:
SVD(奇异值分解)小结
B站上一个讲奇异值分解的视频,这个强烈推荐:
什么是奇异值分解SVD

原理部分,感兴趣的可以自己去了解,这里只说明在DLT变换中如何使用。
通过对一个矩阵C进行奇异值分解可以得到U、S、V三个矩阵,其中S是一个由奇异值组成的对角阵。这里我们只需要用到S和V。

在上一篇帖子中,构造的等式是 CL = I ,然后通过矩阵运算解出L。

C矩阵的大小是 12×11,在改变方法过后,我们这里将右边的 I 移项到左边,在 L的末尾加上一个 1 ,将 I 项 与 C 项合并。
合并后的C矩阵的大小为 12×12。

然后对 C 矩阵进行奇异值分解,得到 U、S、V 三个矩阵(在MATLAB和EIGEN中使用SVD分解,得到的结果中的 V 实际都是V的转置,也就是Vt,但我们这里使用的就是Vt,至于为什么不直接写成Vt,因为我看到的资料里都是这样写的>_<)。

S 是一个由奇异值组成的对角阵,其中最小的奇异值所在的,在矩阵V(就是实际的Vt)中对应的列向量就是我们需要的结果了。
注:MATLAB和EIGEN中使用SVD分解得到的奇异值都是按照从大到小的顺序排列的,最小的奇异值就是最后列,因此这里我们直接取V的最后一列。如果是自己写SVD分解的话需要注意这一点。

废话就这么多了,直接看代码吧

MATLAB代码

%% DLT 算法需要用到 6 对点 ,前三列是 X Y Z 表示空间坐标 ,后两列 x y 表示图像坐标,下面是测试数据
Points = [  99.1517085791261, -0.892099762666786, 3.06159510601795, 163.209290388816, 182.199675950568;
		100.558334460204, 0.868021368458366, 2.25981241694746, 608.892566967667, 701.375883991155;
		100.137647321744, -0.0612187178835884, 2.02380413900248, 449.262241640596, 377.206100107244;
		99.6742452887978, -0.675635383613515, 3.58856908136781, 316.188427147902, 257.277246206713;
		99.6224300840896, 0.0570662710124255, 2.33129745899956, 267.575494465364, 430.054554508315;
		100.203963882803, -0.474057430919711, 3.30815819695356, 439.688462560083, 287.229433675101];

% 赋值 有6 个点,所以C的大小为 12×12,
C = zeros(12,12);
for i = 1:6
    X = Points(i,1);Y = Points(i,2);Z = Points(i,3);x = Points(i,4);y = Points(i,5);
    C(i*2-1,:) = [X,Y,Z,1,0,0,0,0,-x*X,-x*Y,-x*Z,-x];
    C(i*2,:)   = [0,0,0,0,X,Y,Z,1,-y*X,-y*Y,-y*Z,-y];
    
end

[U,S,V] = svd(C);

% 最小的奇异值对应的列向量
L = V(:,end);

P = reshape(L,[4,3])';
P = P/P(3,3);

%% 验证
Point3d = ones(4,6);
Point3d(1:3,:) = Points(:,1:3)';

Point2d = Points(:,4:5)';

Res = P*Point3d;

Res2d(1,:) = Res(1,:)./Res(3,:);
Res2d(2,:) = Res(2,:)./Res(3,:);

disp(Point2d)
disp(Res2d)

diff = Point2d - Res2d;
disp(diff);

运行结果

在这里插入图片描述

结语

可以看出,相较于上一篇帖子,改用SVD分解得到的结果精度是大幅度提高的。
本来是可以到此结束的,不过。。。那就再水一篇帖子吧!

【计算机视觉】直接线性变换(DLT)求解P矩阵(3 加入坐标的归一化)(附MATLAB代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机视觉】直接线性变换(DLT)求解P矩阵(2 使用SVD分解)(附MATLAB代码) 的相关文章

  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • 如何在matlab中绘制彩色一维直方图

    我有一个一维数组 X 其中包含相关系数的统计数据 我想绘制一个彩色直方图 我使用以下代码 histogram X 10 它可以创建具有单色的直方图 现在我想绘制一个直方图 其中每个条形都有不同的颜色 但 FaceColor 选项只能调整整个
  • MATLAB 图像锐化 - 使用(1-高斯低通滤波器)的高斯高通滤波器

    我试图通过设计高斯高通滤波器来锐化图像 我想利用高通滤波器相当于单位矩阵减去低通滤波器的事实来做到这一点 所以我执行了以下操作 image imread Question3 Data Cats jpg read image H 1 fspe
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • MATLAB 中元胞数组的左连接

    I ve 2 cellMATLAB 中的数组 例如 A jim 4 paul 5 sean 5 rose 1 第二个 B jim paul george bill sean rose 我想做一个 SQL 左连接 这样我就可以得到 B 中的所
  • 如何检测图像中对象的实例?

    我有一张包含几个特定对象的图像 我想检测这些物体在该图像中的位置 为此 我有一些模型图像 其中包含我想要检测的对象 这些图像在我想要检测的对象实例周围得到了很好的裁剪 这是一个例子 在这张大图里 我想检测此模型图像中表示的对象 自从你最初发
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • MATLAB 在 MATLAB 7.10.0 学生版中似乎找不到 csaps()

    我有一些代码使用csaps Matlab的三次平滑样条拟合函数 http www mathworks com help toolbox curvefit csaps html我想将其提供给使用 MATLAB 7 10 0 R2010a 的学
  • 将输出从符号数学 (sym) 转换为浮点型

    我的问题类似于这个问题 https stackoverflow com questions 11114101 how to convert mupad symbol i sqrt 1 to i in matlab 11114959 1111
  • 如何使用Matlab提高PSD的分辨率

    我有音频信号 我用 Matlab 读取该信号 并使用 pwelch 获取其 PSD 这是我正在使用的代码 x Fs audioread audioFile wav x x 1 mono xPSD f pwelch x hamming 512
  • 如何建立数据流挖掘的滑动窗口模型?

    我们遇到的情况是 流 来自传感器的数据或服务器上的点击流数据 采用滑动窗口算法 我们必须将最后 例如 500 个数据样本存储在内存中 然后 这些样本用于创建直方图 聚合并捕获有关输入数据流中异常的信息 请告诉我如何制作这样的滑动窗 如果您询
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是

随机推荐

  • 信息安全管理(CISP)—— 部分重点内容总结

    目录 一 风险评估方法 定量分析计算 原理 公式 例题 二 风险评估要素之间的关系 三 GB Z 24364 2009信息安全风险管理指南 四阶段 两过程 四 能力成熟度模型SSE CMM 域维 能力维 五 等级保护2 0的工作流程 系统定
  • 利用Intellij IDEA创建Spring的Helloworld

    引言 Spring 作为一款轻量级的框架 自然会赢得大多数开发者的信赖 笔者今天也开始学习Spring框架了 那么如何利用当今非常火的IDEA来开发Spring呢 按照国际惯例 先从Spring的HelloWorld开始吧 准备环境 Int
  • validation query

    public static void mySQLConfigPlugin Plugins me C3p0Plugin dbplugin createC3p0Plugin DruidPlugin dbplugin createDruidPlu
  • sql优化

    SQL总结 优化部分 1 应尽量避免在 where 子句中使用 或 lt gt 操作符 否则将引擎放弃使用索引而进行全表扫描 2 对查询进行优化 应尽量避免全表扫描 首先应考虑在 where 及 order by 涉及的列上建立索引 3 应
  • 模糊数学Python(一)模糊运算

    代码 import numpy as np def istype a 判断模糊矩阵a的类型 a np array a s np eye a shape 0 a shape 1 if a gt s all and a T a all retu
  • 安装12.04lts的两个问题总结

    因为在win7下有很多bug 老师叫我用Linux来完成项目的最后一步 啊啊啊 之前一直是在虚拟机里面搞 安装Ubuntu的过程中遇到了好多个问题 好吧好吧 下面总结一下 让遇到同样问题的朋友少走点弯路吧 1 分区问题 建立 主分区 之后
  • 数据操作之-dataframe常见操作:取行、列、切片、统计特征值

    import numpy as np import pandas as pd from pandas import from numpy import data DataFrame np arange 16 reshape 4 4 inde
  • Spring Boot 学习研究笔记(十八) 添加log4j2日志文件

    Spring Boot 添加log4j2日志文件 对于一个线上程序或者服务而言 重要的是要有日志输出 这样才能方便运维 而日志的输出需要有一定的规划 如日志命名 日志大小 日志分割的文件个数等 在SpringBoot的框架下 会使用log4
  • 栈头文件C语言

    Stack ADT h 栈模型头文件 数据类型定义 typedef char Name typedef struct stack node Name name struct stack node next Stack Node typede
  • GD32450i-EVAL学习笔记 6 - ADC

    目录 1 初始化ADC 1 1 使能RCU 1 2 设置频率 1 3 设置分辨率 1 4 设置数据对齐方式 1 5 使能扫描模式 1 6 设置触发模式 1 6 使能ADC 2 初始化通道规则 3 通道使能 4 软件触发使能 5 获取ADC的
  • C#List类容输出

    将集合中的类容 添加间隔符号后 输出为string List
  • vue之babel自动埋点

    公司项目是vue单页面技术 这天组长对我说 为了凸显我们的作用 做点外行或者新手看起来高深的东西 例如自动埋点 当时我的表情先是 然后摸鱼摸习惯了 就是这种状态 最后组长说领导的态度决定我们的绩效 没办法 为了money 无奈打开了老朋友
  • nacos集群部署遇到的问题总结

    问题一 内存不足 问题描述 nacos is starting with cluster Error occurred during initialization of VM Could not reserve enough space f
  • Eclipse android apk打包

    Eclipse android 开发更改apk名字 有以下几步 第一步 修改工程包名 在eclipse里 找到项目包和java包 原则上都一样 就可以按 F2 修改名字 随之 源 java也会得到相应的修改 然而每个 java文件都需要把如
  • Fortify 代码扫描安装使用教程

    前言 Fortify 能够提供静态和动态应用程序安全测试技术 以及运行时应用程序监控和保护功能 为实现高效安全监测 Fortify具有源代码安全分析 可精准定位漏洞产生的路径 以及具有1分钟1万行的扫描速度 Fortify SCA 支持丰富
  • 现在投资创客教育

    很多人会问创客要不要投资 就像吃西红柿鸡蛋面要不要用刀叉一样 你当然可以用 也可以用筷子 格物斯坦表示如果没有筷子 喜欢用手抓着吃也是可以的啊 投资人是路径的一种 不是唯一 更不是全部 投资创客教育是教育培训行业比较热门的话题 该行业未来是
  • Python基础语法学习之变量与赋值

    近几年Python飞速发展 开始学习Python的人群不在仅仅局限于编程开发者 许多其他行业的从业者也开始将Python作为自己的职业技能 本文仍然是针对零基础的初学者 继续学习Python的基础语法 变量与赋值 主要内容包括变量和赋值的概
  • el-checkbox-group限制勾选数量

  • 代理模式:静态代理和动态代理

    代理模式 代理对象增强对目标对象的功能 分类 静态代理 动态代理 jdk代理通过实现接口 cglib通过实现类实现 静态代理 JDK动态代理 CGLIB代理模式 通过回调拦截器方法实现代理对象的生成
  • 【计算机视觉】直接线性变换(DLT)求解P矩阵(2 使用SVD分解)(附MATLAB代码)

    引言 之前的帖子已经完成了一种计算直接线性变换的方法 是直接通过矩阵运算来进行的 不过随后得到的结果并不能满足精度要求 如果只是用来作为迭代优化的一个初值的话 对于精度的要求倒也不用那么高 但在查阅资料时又发现了另一种解法 是通过SVD分解