对应点已知时最优变换求解介绍以及SVD代码示例

2024-02-14 05:44

本文主要是介绍对应点已知时最优变换求解介绍以及SVD代码示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、空间上两组点希望找到一个刚性变换,在最小二乘的意义上最优地对齐两个点集,就是说找到一个旋转矩阵R和一个平移向量t。 

二、SVD代码示例

C++代码

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <pcl/common/transforms.h>
#include <pcl/registration/transformation_estimation_svd.h>using namespace Eigen;
using namespace std;int main(int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>());pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>());cloud_in->width = 3;cloud_in->height = 1;cloud_in->is_dense = false;cloud_in->resize(cloud_in->width * cloud_in->height);cloud_out->width = 3;cloud_out->height = 1;cloud_out->is_dense = false;cloud_out->resize(cloud_out->width * cloud_out->height);for (size_t i = 0; i < cloud_in->points.size(); i++){// RAND_MAX = 2^15 - 1cloud_in->points[i].x = 3.0f * rand() / (RAND_MAX + 1.0f);cloud_in->points[i].y = 3.0f * rand() / (RAND_MAX + 1.0f);cloud_in->points[i].z = 3.0f * rand() / (RAND_MAX + 1.0f);cout << cloud_in->points[i].x << "  \t" << cloud_in->points[i].y << "  \t" << cloud_in->points[i].z << endl;}Eigen::Affine3f transform = Eigen::Affine3f::Identity();transform.translation() << 1.0, 2.0, 3.0;float angle_x = 45 * M_PI / 180.0;float angle_y = 45 * M_PI / 180.0;float angle_z = 45 * M_PI / 180.0;transform.rotate(Eigen::AngleAxisf(angle_x, Eigen::Vector3f::UnitX()));transform.rotate(Eigen::AngleAxisf(angle_y, Eigen::Vector3f::UnitY()));transform.rotate(Eigen::AngleAxisf(angle_z, Eigen::Vector3f::UnitZ()));cout << "变换矩阵:\n" << transform.matrix() << endl;pcl::transformPointCloud(*cloud_in, *cloud_out, transform);//---------------------------------利用SVD方法求解变换矩阵--------------------------pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ> TESVD;pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ>::Matrix4 transformation2;TESVD.estimateRigidTransformation(*cloud_in, *cloud_out, transformation2);// -----------------------------------输出变换矩阵信息------------------------------cout << "The Estimated Rotation and translation matrices (using getTransformation function) are : \n" << endl;printf("\n");printf("    | %6.3f %6.3f %6.3f | \n", transformation2(0, 0), transformation2(0, 1), transformation2(0, 2));printf("R = | %6.3f %6.3f %6.3f | \n", transformation2(1, 0), transformation2(1, 1), transformation2(1, 2));printf("    | %6.3f %6.3f %6.3f | \n", transformation2(2, 0), transformation2(2, 1), transformation2(2, 2));printf("\n");printf("t = < %0.3f, %0.3f, %0.3f >\n", transformation2(0, 3), transformation2(1, 3), transformation2(2, 3));return 0;
}

 结果:

局部特征描述子-CSDN博客 

这篇关于对应点已知时最优变换求解介绍以及SVD代码示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/707639

相关文章

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服