热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MATLAB实现DLT(DirectLinearTransform)算法

MATLAB实现DLT(DirectLinearTransform)算法转载备用作者:My_CSDN_Bo_Ke来源:CSDN原文:htt
MATLAB实现DLT(Direct Linear Transform)算法

转载备用
作者:My_CSDN_Bo_Ke 
来源:CSDN 
原文:https://blog.csdn.net/weixin_40327927/article/details/81020798 


% DLT算法主程序
Left_image=load('left_image.txt');
[Left_L,Left_x0,Left_y0]=Computer_L(Left_image);
Right_image=load('right_image.txt');
[Right_L,Right_x0,Right_y0]=Computer_L(Right_image);
UnknownPoint=load('test2.txt');
Coordinate=Computer_UnknownPoint( UnknownPoint,Left_L,Left_x0,Left_y0,Right_L,Right_x0,Right_y0 );function [ L,x0,y0] = Computer_L( Points )
%功能:计算L系数的近似值和精确值
%输入:Points为控制点的像点坐标及物方坐标%格式为:点号 x y X Y Z
%输出:L系数的精确值,像主点坐标x0,y0%计算L系数近似值
X=zeros(2*size(Points,1),11);
B=zeros(2*size(Points,1),1);
for i=1:size(Points,1);X(2*i-1,1:3)=Points(i,4:6);X(2*i-1,4)=1;X(2*i-1,9:11)=Points(i,2)*Points(i,4:6);X(2*i,5:8)=X(2*i-1,1:4);X(2*i,9:11)=Points(i,3)*Points(i,4:6);B(2*i-1,1)=Points(i,2);B(2*i,1)=Points(i,3);
end
L=X(1:11,:)\(-B(1:11,1));
%计算像主点近似值x0,y0
x0=-(L(1)*L(9)+L(2)*L(10)+L(3)*L(11))/(L(9)*L(9)+L(10)*L(10)+L(11)*L(11));
y0=-(L(5)*L(9)+L(6)*L(10)+L(7)*L(11))/(L(9)*L(9)+L(10)*L(10)+L(11)*L(11));
%计算L系数精确值
M=zeros(2*size(Points,1),12);
W=zeros(2*size(Points,1),1);
n=0;                     %迭代次数统计
while n<10;              %设置L迭代次数为10for i&#61;1:6;A&#61;L(9)*Points(i,4)&#43;L(10)*Points(i,5)&#43;L(11)*Points(i,6)&#43;1;M(2*i-1,1:4)&#61;[Points(i,4:6) 1]/A;M(2*i-1,9:11)&#61;Points(i,2)* M(2*i-1,1:3);R&#61;(Points(i,2)-x0)^2&#43;(Points(i,3)-y0)^2;M(2*i-1,12)&#61;(Points(i,2)-x0)*R;M(2*i,5:8)&#61;M(2*i-1,1:4);M(2*i,9:11)&#61;Points(i,3)* M(2*i-1,1:3);M(2*i,12)&#61;(Points(i,3)-y0)*R;W(2*i-1,1)&#61;Points(i,2)/A;W(2*i,1)&#61;Points(i,3)/A;endM&#61;-M;L&#61;(M&#39;*M)\M&#39;*W;x0&#61;-(L(1)*L(9)&#43;L(2)*L(10)&#43;L(3)*L(11))/(L(9)*L(9)&#43;L(10)*L(10)&#43;L(11)*L(11));y0&#61;-(L(5)*L(9)&#43;L(6)*L(10)&#43;L(7)*L(11))/(L(9)*L(9)&#43;L(10)*L(10)&#43;L(11)*L(11));n&#61;n&#43;1;
end
endfunction [ Coordinate ] &#61; Computer_UnknownPoint( UnknownPoint,Left_L,Left_x0,Left_y0,Right_L,Right_x0,Right_y0 )
%功能&#xff1a;计算待定点物方坐标
%输入&#xff1a;UnknownPoint为待定点在左右片的像点坐标%格式为&#xff1a;点号 左片坐标x y 右片坐标x y%Left_L、Left_x0、Left_y0为左片L系数及像主点坐标%Right_L、Right_x0、Right_y0为右片L系数及像主点坐标
%输出&#xff1a;Coordinate为待定点物方坐标%格式为&#xff1a;点号 X Y Z%Error为计算出的待定点坐标与真实坐标之差%格式为&#xff1a;点号 delta_X delta_Y delta_ZLeft_R&#61;(UnknownPoint(:,2)-Left_x0).^2&#43;(UnknownPoint(:,3)-Left_y0).^2;Left_xx&#61;UnknownPoint(:,2)&#43;(UnknownPoint(:,2)-Left_x0).*Left_R*Left_L(12);Left_yy&#61;UnknownPoint(:,3)&#43;(UnknownPoint(:,3)-Left_y0).*Left_R*Left_L(12);Right_R&#61;(UnknownPoint(:,4)-Right_x0).^2&#43;(UnknownPoint(:,5)-Right_y0).^2;Right_xx&#61;UnknownPoint(:,4)&#43;(UnknownPoint(:,4)-Right_x0).*Right_R*Right_L(12);Right_yy&#61;UnknownPoint(:,5)&#43;(UnknownPoint(:,5)-Right_y0).*Right_R*Right_L(12);%计算待定点物方坐标近似值B&#61;zeros(3,3);C&#61;zeros(3,1);XYZ&#61;zeros(size(UnknownPoint,1),3);for i&#61;1:size(UnknownPoint,1);B(1,1)&#61;Left_L(1)&#43;Left_xx(i)*Left_L(9);B(1,2)&#61;Left_L(2)&#43;Left_xx(i)*Left_L(10);B(1,3)&#61;Left_L(3)&#43;Left_xx(i)*Left_L(11);B(2,1)&#61;Left_L(5)&#43;Left_yy(i)*Left_L(9);B(2,2)&#61;Left_L(6)&#43;Left_yy(i)*Left_L(10);B(2,3)&#61;Left_L(7)&#43;Left_yy(i)*Left_L(11);B(3,1)&#61;Right_L(1)&#43;Right_xx(i)*Right_L(9);B(3,2)&#61;Right_L(2)&#43;Right_xx(i)*Right_L(10);B(3,3)&#61;Right_L(3)&#43;Right_xx(i)*Right_L(11);C(1,1)&#61;Left_L(4)&#43;Left_xx(i);C(2,1)&#61;Left_L(8)&#43;Left_yy(i);C(3,1)&#61;Right_L(4)&#43;Right_xx(i);XYZ(i,:)&#61;(B\(-C))&#39;;end%计算待定点物方坐标精确值N&#61;zeros(4,3);Q&#61;zeros(4,1);delta_XYZ&#61;100*ones(1,3);            %相邻两次迭代差值for i&#61;1:size(UnknownPoint,1);n&#61;0;                            %统计迭代次数while max(abs(delta_XYZ))>0.000001;A_L&#61;Left_L(9)*XYZ(i,1)&#43;Left_L(10)*XYZ(i,2)&#43;Left_L(11)*XYZ(i,3)&#43;1;N(1,1)&#61;-(Left_L(1)&#43;Left_xx(i)*Left_L(9))/A_L;N(1,2)&#61;-(Left_L(2)&#43;Left_xx(i)*Left_L(10))/A_L;N(1,3)&#61;-(Left_L(3)&#43;Left_xx(i)*Left_L(11))/A_L;N(2,1)&#61;-(Left_L(5)&#43;Left_yy(i)*Left_L(9))/A_L;N(2,2)&#61;-(Left_L(6)&#43;Left_yy(i)*Left_L(10))/A_L;N(2,3)&#61;-(Left_L(7)&#43;Left_yy(i)*Left_L(11))/A_L;A_R&#61;Right_L(9)*XYZ(i,1)&#43;Right_L(10)*XYZ(i,2)&#43;Right_L(11)*XYZ(i,3)&#43;1;N(3,1)&#61;-(Right_L(1)&#43;Right_xx(i)*Right_L(9))/A_R;N(3,2)&#61;-(Right_L(2)&#43;Right_xx(i)*Right_L(10))/A_R;N(3,3)&#61;-(Right_L(3)&#43;Right_xx(i)*Right_L(11))/A_R;N(4,1)&#61;-(Right_L(5)&#43;Right_yy(i)*Right_L(9))/A_R;N(4,2)&#61;-(Right_L(6)&#43;Right_yy(i)*Right_L(10))/A_R;N(4,3)&#61;-(Right_L(7)&#43;Right_yy(i)*Right_L(11))/A_R;Q(1,1)&#61;(Left_L(4)&#43;Left_xx(i))/A_L;Q(2,1)&#61;(Left_L(8)&#43;Left_yy(i))/A_L;Q(3,1)&#61;(Right_L(4)&#43;Right_xx(i))/A_R;Q(4,1)&#61;(Right_L(8)&#43;Right_yy(i))/A_R;XYZ_new&#61;((N&#39;*N)\N&#39;*Q)&#39;;delta_XYZ&#61;XYZ_new-XYZ(i,:);XYZ(i,:)&#61;XYZ_new;n&#61;n&#43;1;endendCoordinate&#61;zeros(size(UnknownPoint,1),4);Coordinate(:,1)&#61;UnknownPoint(:,1);Coordinate(:,2:4)&#61;XYZ;
end

 


推荐阅读
  • 非线性门控感知器算法的实现与应用分析 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 利用 JavaScript 和 Node.js 验证时间的有效性
    本文探讨了如何使用 JavaScript 和 Node.js 验证时间的有效性。通过编写一个 `isTime` 函数,我们可以确保输入的时间格式正确且有效。该函数利用正则表达式匹配时间字符串,检查其是否符合常见的日期时间格式,如 `YYYY-MM-DD` 或 `HH:MM:SS`。此外,我们还介绍了如何处理不同时间格式的转换和验证,以提高代码的健壮性和可靠性。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 在Java编程中,初始化List集合有多种高效的方法。本文介绍了六种常见的技术,包括使用常规方式、Arrays.asList、Collections.addAll、Java 8的Stream API、双重大括号初始化以及使用List.of。每种方法都有其特定的应用场景和优缺点,开发者可以根据实际需求选择最合适的方式。例如,常规方式通过直接创建ArrayList对象并逐个添加元素,适用于需要动态修改列表的情况;而List.of则提供了一种简洁的不可变列表初始化方式,适合于固定数据集的场景。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
author-avatar
花非花红非红
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有