PCL专栏目录及须知-CSDN博客
注:这些计算都都是只调Common中的公共函数,因此不单独写main()函数,
只通过控制台打印验证是否可以正常运行,结果是否正确,不做可视化展示,
使用时直接把代码拷贝进去就行。
目录
3.获取点云点中距离最远的两点及距离(时间复杂度高,计算较慢)
名词解释:
欧氏距离与曼哈顿距离
曼哈顿距离:红线代表曼哈顿距离,两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。
1.计算两异面直线之间的最短直线
#include <pcl/common/distances.h>
Eigen::VectorXf lineA(6); // 设置直线a的参数
lineA(0) = 0; lineA(1) = 0; lineA(2) = 0; // 直线a起点的xyz值
lineA(3) = 1; lineA(4) = 1; lineA(5) = 0; // 直线a的方向
Eigen::VectorXf lineB(6); // 设置直线b的参数
lineB(0) = 0; lineB(1) = 0; lineB(2) = 1; // 直线b起点的xyz值
lineB(3) = 1; lineB(4) = 0; lineB(5) = 0; // 直线b的方向
Eigen::Vector4f pt1; // 两直线最短直线上的点1
Eigen::Vector4f pt2; // 两直线最短直线上的点2
pcl::lineToLineSegment(lineA, lineB, pt1, pt2); // 直线A(xyz及方向)、直线B(xyz及方向);两直线最短直线上的点1;两直线最短直线上的点2
结果打印:
2.计算点到直线之间的最短距离
#include <pcl/common/distances.h>
Eigen::Vector4f pt = { 0,0,0,0 }; // 当前点
Eigen::Vector4f line_pt = { 0,0,1,0 }; // 当前直线起点的XYZ值
Eigen::Vector4f line_dir = { 1,1,0,0 }; // 当前直线的朝向
double dis = pcl::sqrPointToLineDistance(pt, line_pt, line_dir); // 点到直线的最短距离
结果打印:
3.获取点云点中距离最远的两点及距离(时间复杂度高,计算较慢)
#include <pcl/common/distances.h>
pcl::PointXYZ p1Max, p2Max;
double maxDis0 = pcl::getMaxSegment(*cloud_in, p1Max, p2Max); // 计算所有点云点中距离最远的两点及距离(时间复杂度高,计算较慢)
pcl::Indices indicesMaxSeg;
indicesMaxSeg.push_back(0); // 手动添加索引,一般是计算得出的结果
indicesMaxSeg.push_back(1);
indicesMaxSeg.push_back(2);
indicesMaxSeg.push_back(3);
double maxDis1 = pcl::getMaxSegment(*cloud_in, indicesMaxSeg, p1Max, p2Max); // 计算当前索引的点云点中距离最远的两点及距离
结果打印:
4.计算两点欧式距离(接口一)
#include <pcl/common/distances.h>
pcl::PointXYZ p1Euc = { 0,0,0 };
pcl::PointXYZ p2Euc = { 1,2,3 };
double disEucSqu = pcl::squaredEuclideanDistance(p1Euc, p2Euc); // 两点欧氏距离的平方
double disEuc = pcl::euclideanDistance(p1Euc, p2Euc); // 两点欧氏距离 // 两点欧氏距离
结果打印:
5.计算两点欧式距离(接口二)
#include <pcl/registration/distances.h>
/****************计算两三维向量的欧式距离<distances.h>********************/
Eigen::Vector4f v5(1, 2, 3, 0);
Eigen::Vector4f v6(2, 3, 4, 0);
double dis3 = pcl::distances::l2(v5, v6);
std::cout << "待计算向量1:" << v5 << std::endl;
std::cout << "待计算向量2:" << v6 << std::endl;
std::cout << "距离:" << dis3 << std::endl;
结果打印:
6.计算两点欧式距离平方(接口一)【不常用】
#include <pcl/registration/distances.h>
/****************通过Huber核计算两三维向量的距离<distances.h>********************/
Eigen::Vector4f v1(1, 2, 3, 0);
Eigen::Vector4f v2(2, 3, 4, 0);
double dis1 = pcl::distances::huber(v1, v2, 1.0);
std::cout << "待计算向量1:" << v1 << std::endl;
std::cout << "待计算向量2:" << v2 << std::endl;
std::cout << "距离:" << dis1 << std::endl;
结果打印:
7.计算两点欧式距离平方(接口二)
#include <pcl/registration/distances.h>
/****************计算两三维向量的欧式距离的平方<distances.h>********************/
Eigen::Vector4f v7(1, 2, 3, 0);
Eigen::Vector4f v8(2, 3, 4, 0);
double dis4 = pcl::distances::l2Sqr(v7, v8);
std::cout << "待计算向量1:" << v7 << std::endl;
std::cout << "待计算向量2:" << v8 << std::endl;
std::cout << "距离:" << dis4 << std::endl;
结果打印:
8.计算两三维向量的曼哈顿距离
#include <pcl/registration/distances.h>
/****************计算两三维向量的曼哈顿距离<distances.h>********************/
Eigen::Vector4f v3(1, 2, 3, 0);
Eigen::Vector4f v4(2, 3, 4, 0);
double dis2 = pcl::distances::l1(v1, v2);
std::cout << "待计算向量1:" << v3 << std::endl;
std::cout << "待计算向量2:" << v4 << std::endl;
std::cout << "曼哈顿距离:" << dis2 << std::endl;
结果打印:
9.计算给定数组的中值
#include <pcl/registration/distances.h>
/****************计算数组的中值<distances.h>********************/
double* array = new double[5]{ 0, 1, 2, 3, 4 };
double median = pcl::distances::computeMedian(array, 5);
std::cout << "待计算数组:" << array << std::endl;
std::cout << "中值:" << median << std::endl;
结果打印: