PCL点云库(3) — common模块

news2024/11/25 12:48:54

目录

3.1 common模块中的头文件

3.2 common模块中的基本函数

(1)angle角度转换

(2)distance距离计算

(3)random随机数生成

(4)sping扩展模块

(5)time获取时间模块

(6)vector_average计算加权平均值和协方差矩阵

(7)time_trigger计时触发器

(8)colors颜色生成函数

(9)centroid点云计算

(10)transforms点云变换模块

参考文章


common模块中主要是包含了PCL库常用的公共数据结构和方法,比如PointCloud的类和许多用于表示点,曲面,法向量,特征描述等点的类型,用于计算距离,均值以及协方差,角度转换以及几何变化的函数等。这个模块是不依赖其他模块的,所以是可以单独编译成功,单独编译出来可利用其中的数据结构自行开发。

3.1 common模块中的头文件

官方文档:Point Cloud Library (PCL): Module common

中文说明:

头文件功能
angles.h定义了标准的C接口的角度计算函数
distances.h定义标准的C接口用于计算距离
random.h定义一些随机点云生成的函数
time.h定义了时间计算的函数
time_trigger定义计时触发器
centriod.h定义了中心点的估算以及协方差矩阵的计算
common.h标准的C以及C++类,定义了common所有的方法 
file_io.h定义了一些文件帮助写或者读方面的功能
geometry.h定义一些基本的几何功能的函数
intersection.h定义线与线相交的函数
norm.h定义了标准的C方法计算矩阵的正则化
Point_types定义了所有PCL实现的点云的数据结构的类型
其他常用功能方法
spring.h定义点云按行列扩展,或镜像翻转
vector_average定义计算加权平均值和协方差矩阵
color.h定义颜色生成函数

.

.

.

3.2 common模块中的基本函数

下面所有的程序共用如下的CmakeLists.txt文件

// CMakeLists.txt 文件
// 后面将projectname安装自己的名字更改
cmake_minimum_required(VERSION 2.6)
project(projectname)
 
find_package(PCL 1.10 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(projectname projectname.cpp)
target_link_libraries (projectname ${PCL_LIBRARIES} )

install(TARGETS projectname RUNTIME DESTINATION bin)

(1)angle角度转换

在pcl/common/angel.h文件中,有三个函数实现

// 从弧度到角度
pcl::rad2deg(float alpha) 
// 从角度到弧度
pcl::deg2rad(float aipha)
// 正则化角度在(-PI,PI)之间
pcl::normAngle(float alpha)
#include <iostream>
#include <pcl/common/angles.h>
using namespace std;

int main()
{
    float alpha = 30;
    cout << pcl::deg2rad(alpha) << "-" << 30.0*3.14159/180 << endl;
    double beta = pcl::deg2rad(alpha)*2;
    cout << pcl::rad2deg(beta) << endl;

    return 0;
}

(2)distance距离计算

在distance头文件中总共有五个函数,包括 lineToLineSegment 、sqrPointToLineDistance 、getMaxSegment、squaredEuclideanDistance 、euclideanDistance这五个函数。

// 获取两条三维直线之间的最短三维线段
pcl::lineToLineSegment (const Eigen::VectorXf &line_a, const Eigen::VectorXf &line_b, Eigen::Vector4f &pt1_seg, Eigen::Vector4f &pt2_seg)
// 在给定的一组点中获得最大分段,并返回最小和最大点。
pcl::getMaxSegment (const pcl::PointCloud< PointT > &cloud, PointT &pmin, PointT &pmax)
// 获取点到线的平方距离(由点和方向表示)
pcl::sqrPointToLineDistance (const Eigen::Vector4f &pt, const Eigen::Vector4f &line_pt, const Eigen::Vector4f &line_dir)
// 欧氏距离平方求解
pcl::squaredEuclideanDistance (const PointType1& p1, const PointType2& p2)
// 欧式距离求解
euclideanDistance (const PointType1& p1, const PointType2& p2)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/distances.h>

using namespace std;

int main()
{
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);
    viewer->setWindowName("PCL Distance Demo");

#if 0
    // 1. lineToLineSegment
    Eigen::VectorXf line_a(6),line_b(6);
    Eigen::Vector4f pt1_seg, pt2_seg;

    line_a << -5,0,0,10,0,0;
    line_b << 0,-5,5,0,10,0;

    pcl::ModelCoefficients line_coeff;
    line_coeff.values.resize (6);

    // line_a
    line_coeff.values[0] = line_a(0);
    line_coeff.values[1] = line_a(1);
    line_coeff.values[2] = line_a(2);

    line_coeff.values[3] = line_a(3);
    line_coeff.values[4] = line_a(4);
    line_coeff.values[5] = line_a(5);
    viewer->addLine(line_coeff,"line_a");

    // line_b
    line_coeff.values[0] = line_b(0);
    line_coeff.values[1] = line_b(1);
    line_coeff.values[2] = line_b(2);

    line_coeff.values[3] = line_b(3);
    line_coeff.values[4] = line_b(4);
    line_coeff.values[5] = line_b(5);
    viewer->addLine(line_coeff,"line_b");

    pcl::lineToLineSegment(line_a,line_b,pt1_seg, pt2_seg);

    viewer->addLine(pcl::PointXYZ(pt1_seg.x(),pt1_seg.y(),pt1_seg.z()),
                    pcl::PointXYZ(pt2_seg.x(),pt2_seg.y(),pt2_seg.z()),
                    1.0,0,0,"lineseg");

    // 2. sqrPointToLineDistance
    double disSqr =  pcl::sqrPointToLineDistance(pt1_seg,
                                                 Eigen::Vector4f(line_b(0),line_b(1),line_b(2),0),
                                                 Eigen::Vector4f(line_b(3),line_b(4),line_b(5),0));

    cout << "pcl::sqrPointToLineDistance: " << disSqr << endl;

    // 3. squaredEuclideanDistance
    float dis = pcl::squaredEuclideanDistance(pcl::PointXYZ(pt1_seg.x(),pt1_seg.y(),pt1_seg.z()),
                                              pcl::PointXYZ(pt2_seg.x(),pt2_seg.y(),pt2_seg.z()));

    cout << "pcl::squaredEuclideanDistance: " << dis << endl;

    // 4. euclideanDistance
    dis = pcl::euclideanDistance(pcl::PointXYZ(pt1_seg.x(),pt1_seg.y(),pt1_seg.z()),
                                 pcl::PointXYZ(pt2_seg.x(),pt2_seg.y(),pt2_seg.z()));

    cout << "pcl::squaredEuclideanDistance: " << dis << endl;

#else
    // 5. getMaxSegment
    pcl::PointCloud<pcl::PointXYZRGB> cloud;
    pcl::io::loadPCDFile("../pig1.pcd",cloud);
    pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud.makeShared());
    viewer->addPointCloud(cloud.makeShared(),rgb);

    pcl::PointXYZRGB pmin,pmax;
    double maxseg = pcl::getMaxSegment(cloud,pmin,pmax);
    cout << "pcl::getMaxSegment: " << maxseg << endl;
    viewer->addArrow(pmin,pmax,1.0,0.0,1.0,0,1.0,1.0);
#endif

    while(!viewer->wasStopped())
        viewer->spinOnce(100);

    return 0;
}

(3)random随机数生成

//高斯噪声产生器
pcl::common::CloudGenerator<pcl::PointXYZ, pcl::common::NormalGenerator<float> > generator;  
//均匀分布噪声产生器
pcl::common::UniformGenerator<pcl::PointXYZ, pcl::common::NormalGenerator<float> > 
//生成随机种子  
uint32_t seed = static_cast<uint32_t> (time(NULL));                                         

//根据参数添加x方向的噪声
pcl::common::NormalGenerator<float>::Parameters x_params(xmean, xstddev, seed++);
generator.setParametersForX(x_params);                                                  
//根据参数添加y方向的噪声   
pcl::common::NormalGenerator<float>::Parameters y_params(ymean, ystddev, seed++);
generator.setParametersForY(y_params);                                                 
//根据参数添加z方向的噪声    
pcl::common::NormalGenerator<float>::Parameters z_params(zmean, zstddev, seed++);
generator.setParametersForZ(z_params);                                                   

//产生等数据量的随机噪声    
generator.fill((*cloud).width, (*cloud).height, *gauss_cloud);                                
#include <iostream>
#include <ctime>
#include <pcl/common/random.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>

using namespace std;

int main()
{
    pcl::PointCloud<pcl::PointXYZ> ncloud,ucloud;

    uint32_t seed = static_cast<uint32_t> (time(NULL));
    pcl::common::NormalGenerator<float> normal(0,5,seed);

    for(int i = 0; i < 2000; ++i)
    {
         ncloud.push_back(pcl::PointXYZ(normal.run(),normal.run(),normal.run()));
    }

    pcl::common::UniformGenerator<float> uniform(0,10,seed);

    for(int i = 0; i < 2000; ++i)
    {
        ucloud.push_back(pcl::PointXYZ(uniform.run()+10,uniform.run(),uniform.run()));
    }

    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer());
    viewer->setWindowName("PCL Random Test");
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> rgb(ncloud.makeShared(),"z");

    viewer->addPointCloud(ncloud.makeShared(),rgb,"normal");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,4,"normal");
    viewer->addPointCloud(ucloud.makeShared(),rgb,"uniform");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,4,"uniform");

    while(!viewer->wasStopped())
        viewer->spinOnce(100);

    return 0;
}

(4)sping扩展模块

// 按行扩展
pcl::common::expandRows (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                         const PointT& val, const std::size_t& amount)
// 按列扩展
pcl::common::expandColumns (const PointCloud<PointT>& input, PointCloud<PointT>& output, 
                            const PointT& val, const std::size_t& amount)
// 复制行
pcl::common::duplicateRows (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                            const std::size_t& amount)
// 复制列
pcl::common::duplicateColumns (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                               const std::size_t& amount)
// 删除行
pcl::common::deleteRows (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                         const std::size_t& amount)
// 删除列
pcl::common::deleteCols (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                         const std::size_t& amount)
// 镜像翻转行
pcl::common::mirrorRows (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                         const std::size_t& amount)
// 镜像翻转列
pcl::common::mirrorColumns (const PointCloud<PointT>& input, PointCloud<PointT>& output,
                                  const std::size_t& amount)
#include <iostream>
#include <pcl/common/spring.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

using namespace std;

void printCloud(pcl::PointCloud<pcl::PointXYZ> &cloud)
{
    int nrow = cloud.height;
    int ncol = cloud.width;

    for(int i = 0; i < nrow; ++i)
    {
        for(int j = 0; j < ncol; ++j)
        {
            cout << "(" << cloud.at(i*ncol + j).x << "," <<  cloud.at(i*ncol + j).y << "," << cloud.at(i*ncol + j).z << ") ";
        }
        cout << endl;
    }
}

int main()
{
    pcl::PointCloud<pcl::PointXYZ> cloud;
    for(int irow = 0; irow < 3; ++irow)
    {
        for(int icol = 0; icol < 4; ++icol)
        {
            cloud.push_back(pcl::PointXYZ(irow,icol,irow+icol));
        }
    }
    cloud.width = 3;
    cloud.height = 4;
    cout << cloud;
    printCloud(cloud);

    pcl::PointCloud<pcl::PointXYZ> ocloud;
    pcl::common::expandRows(cloud,ocloud,pcl::PointXYZ(99,99,99),2);
    cout << ocloud;
    printCloud(ocloud);
    cout << "----------------------------------" << endl;
    pcl::common::duplicateColumns(cloud,ocloud,1);

    cout << ocloud;
    printCloud(ocloud);
    cout << "----------------------------------" << endl;

    pcl::common::deleteRows(ocloud,ocloud,1);
    cout << ocloud;
    printCloud(ocloud);
    cout << "----------------------------------" << endl;

    pcl::common::mirrorRows(ocloud,cloud,1);
    cout << cloud;
    printCloud(cloud);

    return 0;
}

(5)time获取时间模块

#include <iostream>
#include <pcl/common/time.h>
using namespace std;

int main()
{
    pcl::StopWatch watch;
    pcl::EventFrequency freq;

    {
        pcl::ScopeTime scope("test for");
        int res;
        for(int i = 0; i < 1000000000; ++i)
        {
            res = i*i;
            if(i%100 == 0) freq.event();
        }
    }

    cout << watch.getTime() << "ms - "  << watch.getTimeSeconds() << "s" << endl;
    cout << (uint32_t)freq.getFrequency() << endl;

    DO_EVERY(20,[]{ cout << "test do every" << endl;}());

    return 0;
}

(6)vector_average计算加权平均值和协方差矩阵

#include <iostream>
#include <pcl/common/vector_average.h>
using namespace std;

int main()
{
    pcl::VECtor
    pcl::VectorAverage<float,4> vec;
    pcl::VectorAverage<float,4>::VectorType sample1;
    sample1 << 1,2,3,4;
    vec.add(sample1);

    Eigen::Vector4f sample2;
    sample2 << 2,5,7,1;
    vec.add(sample2,2);

    Eigen::Matrix<float, 4, 1> sample3;
    sample3 << 0,7,8,4;
    vec.add(sample3);

    cout << vec.getMean() << endl << vec.getCovariance() << endl;

    Eigen::Vector4f v,v1,v2,v3;
    vec.doPCA(v,v1,v2,v3);

    cout << v << endl << v1 << endl << v2 << endl << v3 << endl;

    return 0;
}

(7)time_trigger计时触发器

#include <iostream>
#include <pcl/common/time_trigger.h>
using namespace std;

static int cnt = 0;
struct callBack
{
    void operator() (){
        cout << "callBack " << cnt++ << endl;
    }
};

int main()
{
    // 定义计时触发器类
    pcl::TimeTrigger triger/*(1,callBack())*/;
    triger.setInterval(0.5);
    triger.registerCallback(callBack());
    triger.start();
    // 将主线程暂停100s
    std::this_thread::sleep_for(std::chrono::seconds(100));

    return 0;
}

(8)colors颜色生成函数

#include <iostream>
#include <pcl/common/colors.h>
#include <array>

using namespace std;

int main()
{
    srand(time(nullptr));
    pcl::RGB rgb = pcl::getRandomColor(0.5,1.5);
    cout << "(" << (int)rgb.r << "," << (int)rgb.b << "," << (int)rgb.g  << "," << (int)rgb.a << ")" << endl;

    pcl::ColorLUT<pcl::LUT_GLASBEY> glut; //等价于pcl::GlasbeyLUT glut;
    pcl::ColorLUT<pcl::LUT_VIRIDIS> vlut; //等价于pcl::ViridisLUT vlut;

    cout << glut.at(127) << endl << vlut.at(127) << endl << glut.size() << " " << vlut.size() << endl;
    cout << pcl::ColorLUT<pcl::LUT_GLASBEY>::at(100) << endl << pcl::ViridisLUT::at(100) << endl;

    return 0;
}

(9)centroid点云计算

// 计算点云质心
pcl::compute3DCentroid(*cloud_smoothed,centroid); 
// 计算点云协方差矩阵
pcl::computeCovarianceMatrix<pcl::PointXYZRGB,double>
// 计算点云标准化协方差矩阵
pcl::computeCovarianceMatrixNormalized(*cloud,centroid1,covariance_matrix);
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/common/centroid.h>
#include <Eigen/Eigen>

using namespace std;

int main()
{
    pcl::PointCloud<pcl::PointXYZRGB> cloud;
    pcl::io::loadPCDFile("../pig.pcd",cloud);

    Eigen::Matrix<float, 4, 1> centroid;
    pcl::compute3DCentroid<pcl::PointXYZRGB,float>(cloud,centroid);

    cout << "float centroid: \n" << centroid << endl;

    Eigen::Matrix<double, 4, 1> centroid1;
    pcl::compute3DCentroid<pcl::PointXYZRGB,double>(cloud,centroid1);
    cout << "double centroid: \n" << centroid1 << endl;

    Eigen::Matrix<double, 3, 3> covariance_matrix;
    pcl::computeCovarianceMatrix<pcl::PointXYZRGB,double>(cloud,centroid1,covariance_matrix);
    cout << "double covariance_matrix: \n" << covariance_matrix << endl;

    pcl::computeCovarianceMatrixNormalized<pcl::PointXYZRGB,double>(cloud,centroid1,covariance_matrix);
    cout << "double covariance_matrix Normalized: \n" << covariance_matrix << endl;

    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer());
    pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud.makeShared());
    viewer->addPointCloud(cloud.makeShared(),rgb);

    while (!viewer->wasStopped()) {
        viewer->spinOnce(1000);
    }

    return 0;
}

(10)transforms点云变换模块

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/common/transforms.h>
#include <pcl/common/centroid.h>

using namespace std;

using PCRGB = pcl::PointCloud<pcl::PointXYZRGB>;

void transform1(PCRGB &in_cloud,PCRGB &out_cloud)
{
#if 0
    Eigen::Affine3f transform = Eigen::Affine3f::Identity();
    transform.translation() << 20,-10,10;
    transform.rotate(Eigen::AngleAxisf(M_PI/4,Eigen::Vector3f::UnitX()));
#else
    Eigen::Transform<float,3,Eigen::Affine> transform = Eigen::Transform<float,3,Eigen::Affine>::Identity();
    transform.translation() << 10,-5,5;
    transform.rotate(Eigen::AngleAxisf(M_PI/4,Eigen::Vector3f::UnitX()));
    transform.scale(2);
#endif

    cout << transform.matrix() << endl;

    pcl::transformPointCloud(in_cloud,out_cloud,transform);
}

void transform2(PCRGB &in_cloud,PCRGB &out_cloud)
{
#if 0
    Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
    float theta = M_PI/2;
//    transform(0,0) *= 2;
    transform(1,1) = cos(theta);
    transform(2,2) = cos(theta);
    transform(2,1) = sin(theta);
    transform(1,2) = -sin(theta);

    transform(0,3) = 20;
    transform(1,3) = -10;
    transform(2,3) = 20;
#else
    Eigen::Matrix<float, 4, 4> transform = Eigen::Matrix<float, 4, 4>::Identity();
    float theta = M_PI/2;
    transform(0,0) *= 1;
    transform(1,1) = 1*cos(theta);
    transform(2,2) = 1*cos(theta);
    transform(2,1) = 1*sin(theta);
    transform(1,2) = -1*sin(theta);

    transform(0,3) = 10;
    transform(1,3) = -5;
    transform(2,3) = 10;
#endif

    pcl::transformPointCloud(in_cloud,out_cloud,transform);
}

void transform3(PCRGB &in_cloud,PCRGB &out_cloud)
{
#if 0
    Eigen::Vector3f offset(20,-10,10);
    Eigen::Quaternionf rotation(Eigen::AngleAxisf(-M_PI/2,Eigen::Vector3f::UnitX()));
#else
    Eigen::Matrix<float,3,1> offset(10,-5,5);
    Eigen::Quaternion<float> rotation(Eigen::AngleAxisf(-M_PI/2,Eigen::Vector3f::UnitX()));
#endif

    pcl::transformPointCloud(in_cloud,out_cloud,offset,rotation);
}

void trans(PCRGB &in_cloud,PCRGB &out_cloud,int type)
{
    switch(type){
    case 1:
        transform1(in_cloud,out_cloud);
        break;
    case 2:
        transform2(in_cloud,out_cloud);
        break;
    case 3:
        transform3(in_cloud,out_cloud);
        break;
    default:
        break;
    }
}

int main()
{
    PCRGB in_cloud,out_cloud;
    pcl::io::loadPCDFile("../pig.pcd",in_cloud);
    Eigen::Matrix<float, 4, 1> centroid;
    pcl::compute3DCentroid(in_cloud,centroid);

    Eigen::Affine3f transform0 = Eigen::Affine3f::Identity();
    transform0.translation() << -centroid(0),-centroid(1),-centroid(2);
    pcl::transformPointCloud(in_cloud,in_cloud,transform0);

    trans(in_cloud,out_cloud,2);

    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer());
    pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(in_cloud.makeShared());
    viewer->addPointCloud(in_cloud.makeShared(),rgb,"in_cloud");

    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZRGB> rgbt(out_cloud.makeShared(),"z");
    viewer->addPointCloud(out_cloud.makeShared(),rgbt,"out_cloud");


    while(!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }

    return 0;
}

 

common模块中的基本函数

pcl::rad2deg(fllat alpha) 
从弧度到角度

pcl::deg2rad(float aipha)
从角度到弧度

pcl::normAngle(float alpha)
正则化角度在(-PI,PI)之间

pcl::compute3DCentroid (const pcl::PointCloud< PointT > &cloud, Eigen::Matrix< Scalar, 4, 1 > &centroid)
计算给定一群点的3D中心点,并且返回一个三维向量

pcl::computeCovarianceMatrix (const pcl::PointCloud< PointT > &cloud, const Eigen::Matrix< Scalar, 4, 1 > &centroid, Eigen::Matrix< Scalar, 3, 3 > &covariance_matrix)
计算给定的三维点云的协方差矩阵。

pcl::computeMeanAndCovarianceMatrix (const pcl::PointCloud< PointT > &cloud, Eigen::Matrix< Scalar, 3, 3 > &covariance_matrix, Eigen::Matrix< Scalar, 4, 1 > &centroid
计算正则化的3*3的协方差矩阵以及给定点云数据的中心点

pcl::demeanPointCloud (const pcl::PointCloud< PointT > &cloud_in, const Eigen::Matrix< Scalar, 4, 1 > &centroid, pcl::PointCloud< PointT > &cloud_out)

pcl::computeNDCentroid (const pcl::PointCloud< PointT > &cloud, Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &centroid)
利用一组点的指数对其进行一般的、通用的nD中心估计。

pcl::getAngle3D (const Eigen::Vector4f &v1, const Eigen::Vector4f &v2, const bool in_degree=false)
计算两个向量之间的角度

pcl::getMeanStd (const std::vector< float > &values, double &mean, double &stddev)
同时计算给定点云数据的均值和标准方差

pcl::getPointsInBox (const pcl::PointCloud< PointT > &cloud, Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt, std::vector< int > &indices)
在给定边界的情况下,获取一组位于框中的点

pcl::getMaxDistance (const pcl::PointCloud< PointT > &cloud, const Eigen::Vector4f &pivot_pt, Eigen::Vector4f &max_pt)
给定点云数据中点与点之间的最大距离的值

pcl::getMinMax3D (const pcl::PointCloud< PointT > &cloud, PointT &min_pt, PointT &max_pt)
获取给定点云中的在XYZ轴上的最大和最小值

pcl::getCircumcircleRadius (const PointT &pa, const PointT &pb, const PointT &pc)
计算由三个点pa、pb和pc构成的三角形的外接圆半径。

pcl::getMinMax (const PointT &histogram, int len, float &min_p, float &max_p)
获取点直方图上的最小值和最大值。

pcl::calculatePolygonArea (const pcl::PointCloud< PointT > &polygon)
根据给定的多边形的点云计算多边形的面积

pcl::copyPoint (const PointInT &point_in, PointOutT &point_out)
从Point_in把字段数据赋值到Point_out

pcl::lineToLineSegment (const Eigen::VectorXf &line_a, const Eigen::VectorXf &line_b, Eigen::Vector4f &pt1_seg, Eigen::Vector4f &pt2_seg)
获取两条三维直线之间的最短三维线段

pcl::sqrPointToLineDistance (const Eigen::Vector4f &pt, const Eigen::Vector4f &line_pt, const Eigen::Vector4f &line_dir)
获取点到线的平方距离(由点和方向表示)

pcl::getMaxSegment (const pcl::PointCloud< PointT > &cloud, PointT &pmin, PointT &pmax)
在给定的一组点中获得最大分段,并返回最小和最大点。

pcl::eigen22 (const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector)
确定最小特征值及其对应的特征向量

pcl::computeCorrespondingEigenVector (const Matrix &mat, const typename Matrix::Scalar &eigenvalue, Vector &eigenvector)
确定对称半正定输入矩阵给定特征值对应的特征向量

pcl::eigen33 (const Matrix &mat, typename Matrix::Scalar &eigenvalue, Vector &eigenvector)
确定对称半正定输入矩阵最小特征值的特征向量和特征值

pcl::invert2x2 (const Matrix &matrix, Matrix &inverse)
计算2x2矩阵的逆。

pcl::invert3x3SymMatrix (const Matrix &matrix, Matrix &inverse)
计算3x3对称矩阵的逆。

pcl::determinant3x3Matrix (const Matrix &matrix)
计算3x3矩阵的行列式

pcl::getTransFromUnitVectorsZY (const Eigen::Vector3f &z_axis, const Eigen::Vector3f &y_direction, Eigen::Affine3f &transformation)
获得唯一 的3D旋转,将Z轴旋转成(0,0,1)Y轴旋转成(0,1,0)并且两个轴是正交的。

pcl::getTransformationFromTwoUnitVectorsAndOrigin (const Eigen::Vector3f &y_direction, const Eigen::Vector3f &z_axis, const Eigen::Vector3f &origin, Eigen::Affine3f &transformation)
得到将origin转化为(0,0,0)的变换,并将Z轴旋转成(0,0,1)和Y方向(0,1,0)

pcl::getEulerAngles (const Eigen::Transform< Scalar, 3, Eigen::Affine > &t, Scalar &roll, Scalar &pitch, Scalar &yaw)
从给定的变换矩阵中提取欧拉角

pcl::getTranslationAndEulerAngles (const Eigen::Transform< Scalar, 3, Eigen::Affine > &t, Scalar &x, Scalar &y, Scalar &z, Scalar &roll, Scalar &pitch, Scalar &yaw)
给定的转换中,提取XYZ以及欧拉角

pcl::getTransformation (float x, float y, float z, float roll, float pitch, float yaw)
从给定的平移和欧拉角创建转换矩阵

pcl::saveBinary (const Eigen::MatrixBase< Derived > &matrix, std::ostream &file)
保存或者写矩阵到一个输出流中

pcl::loadBinary (Eigen::MatrixBase< Derived > const &matrix, std::istream &file)
从输入流中读取矩阵

pcl::lineWithLineIntersection (const Eigen::VectorXf &line_a, const Eigen::VectorXf &line_b, Eigen::Vector4f &point, double sqr_eps=1e-4)
获取空间中两条三维直线作为三维点的交点。

pcl::getFieldIndex (const pcl::PCLPointCloud2 &cloud, const std::string &field_name)
获取指定字段的索引(即维度/通道)

pcl::getFieldsList (const pcl::PointCloud< PointT > &cloud)
获取给定点云中所有可用字段的列表

pcl::getFieldSize (const int datatype)
获取特定字段数据类型的大小(字节)。

pcl::concatenatePointCloud (const pcl::PCLPointCloud2 &cloud1, const pcl::PCLPointCloud2 &cloud2, pcl::PCLPointCloud2 &cloud_out)

连接 pcl::PCLPointCloud2类型的点云字段

参考文章

(1)官方文档:Point Cloud Library (PCL): Module common

(2)博客:PCL基础介绍_像话吗的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/461172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

请问你见过吐代码的泡泡吗(冒泡排序)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

现场工程师救火-UEFI(BIOS)节能设置导致金牌服务器只跑出龟速

近期协助出现场&#xff0c;解决了一个非常典型的UEFI 启动参数配置不当导致的服务器降效案例。错误的节能参数配置&#xff0c;导致价值几十万的服务器变成龟速服务器&#xff0c;并造成严重的生产事故。 1. 现象 朋友公司近期准备升级2010年就部署的服务器组&#xff0c;新…

vue移动端项目通用技巧

目录 一、配置文件 1.1、取消eslint校验 1.2、基础文件引入 1.3、iconfont引入svg使用 1.4、css的简化应用 1.5、内容溢出用省略号替代 1.6、非组件库的底部导航跳转 1.7、基础版轮播图 一、配置文件 1.1、取消eslint校验 在vue.config.js文件里&#xff1a; const …

【论文阅读】Robustness in Reinforcement Learning

原文为 Trustworthy Reinforcement Learning Against Intrinsic Vulnerabilities: Robustness, Safety, and Generalizability&#xff0c;是 2022 年 CMU 发表的综述文章。 本文主要关注文章的第二部分即鲁棒性 1. 概述 鲁棒性主要解决的问题是提高策略在面对不确定性或者对抗…

Linux:文件查看:《cat》《more》《less》《head》《tail》《wc》《grep》使用方法

同样是查看为什么要有这么多查看方法&#xff1f;&#xff1f;&#xff1f; 因为他们的用法和扩功能肯定不一样&#xff0c;选择与你需要匹配的一条命令可以节省时间的同时更快速 cat 文件 可以直接查看文件内的内容 直接可以查看文件内的内容 要直接看更多的文件以空格隔开的…

AI大模型+低代码,在项目管理中的应用实践

随着ChatGPT大火之后&#xff0c;新的AI技术和模型被证明已经具备的很高的使用价值。 诸如Copilot、Midjourney、notion等产品通过AI的加持&#xff0c;已经让用户能够充分地在应用层面感受到了便利性。 原本几天的工作通过AI模型&#xff0c;可能只需要1分钟就能完成。可以大…

面试腾讯T7,被按在地上摩擦,鬼知道我经历了什么?

时间总是过得飞快&#xff0c;金三银四已经过去了&#xff0c;人们已经开始备战互联网大厂2023年的秋招计划了。刚好最近我有个小徒弟去腾讯面试的时候挂掉了&#xff0c;感觉被技术吊打。根据他的描述我复盘了一下&#xff0c;希望能给备战秋招的朋友一些帮助。 腾讯面试的内…

Leetcode——485. 最大连续 1 的个数

&#x1f4af;&#x1f4af;欢迎来到的热爱编程的小K的Leetcode的刷题专栏 文章目录 1、题目2、滑动窗口3、一次遍历(官方题解) 1、题目 题目&#xff1a;给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0…

生成对抗网络pix2pixGAN

1.介绍 论文&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 论文地址&#xff1a;https://arxiv.org/abs/1611.07004 图像处理的很多问题都是将一张输入的图片转变为一张对应的 输出图片&#xff0c;比如灰度图、彩色图之间的转换、图像自动…

【JavaEE】SpringMVC_day02

今日内容 完成SSM的整合开发能够理解并实现统一结果封装与统一异常处理能够完成前后台功能整合开发掌握拦截器的编写 1&#xff0c;SSM整合 前面我们已经把Mybatis、Spring和SpringMVC三个框架进行了学习&#xff0c;今天主要的内容就是把这三个框架整合在一起完成我们的业务功…

网络基础-IP和端口号以及认识传输层协议

概念回顾 MAC地址仅需要在同一个局域网下唯一&#xff0c;就可以保证不会出现通讯问题。 通信的目的是两台机器上的应用软件要通信。即客户端进程和服务端进程要获取这个数据&#xff0c;借助主机来完成通信。故将数据在主机间转发仅仅是手段&#xff0c;机器收到后&#xff…

为什么别的测试工程师年薪30W,而你做不到?

最近收到一位同学的私信&#xff1a; “看到了这个岗位想去应聘&#xff0c;但任职要求熟悉Shell、Python、Java其中的一种语言。软件测试工程师不是对编程代码要求不高吗&#xff1f;我如果学习应该选择Java还是Python&#xff1f;” 对于刚入行的测试新人来说&#xff0c;在求…

深入理解Linux内核(第三版)- 进程切换

为了控制进程的执行&#xff0c;内核必须有能力挂起正在CPU上运行的进程&#xff0c;并恢复以前挂起的某个进程的执行。这种行为被称为进程切换&#xff08;process switch&#xff09;、任务切换&#xff08;task switch&#xff09;或上下文切换&#xff08;context switch&a…

手把手教你Java实现栈和队列

目录 一、栈(Stack) 1、概念 2、栈的使用 3、栈的模拟实现 4、栈的应用场景 2. 队列(Queue) 1、概念 2、队列的使用 3、队列模拟实现 4、循环队列 三、双端队列 (Deque) 五、栈和队列的互相实现 用队列实现栈&#xff1a; 用栈实现队列&#xff1a; 一、栈(St…

【剑指offer】(2)

系列文章目录 剑指offer系列是一本非常著名的面试题目集&#xff0c;旨在帮助求职者提升编程能力和应对面试的能力。 文章目录 系列文章目录[TOC](文章目录) 前言一、 用两个栈实现队列&#x1f525; 思路&#x1f308;代码 二、青蛙跳台阶问题&#x1f525; 思路&#x1f308…

git从入门到卸载

git是什么&#xff1f; 从git的官网Git可以找到&#xff1a; Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git is easy to learn and has a tiny footpr…

SANGFOR防火墙如何查看现网运行参数

环境&#xff1a; 防火墙 8.0.48 AF-1000BB1510 问题描述&#xff1a; 公司防火墙设备使用2年多了 AF-2000-FH2130B-SC;性能参数&#xff1a;网络层吞吐量&#xff1a;20G&#xff0c;应用层吞吐量&#xff1a;9G&#xff0c;防病毒吞吐量&#xff1a;1.5G&#xff0c;IPS吞…

python基础实战4-python基础语法

1、注释&#xff08;Comments&#xff09; 注释用来向用户提示或解释某些代码的作用和功能&#xff0c;它可以出现在代码中的任何位置。 Python解释器在执行代码时会忽略注释&#xff0c;不做任何处理&#xff0c;就好像它不存在一样。 1.1 代码注释介绍 注释就是对代码的解…

计算机组成原理 指令系统(1)

本文是HIT计算机组成原理上课笔记&#xff0c;由于唐书有些内容讲的比较抽象&#xff0c;添加了一些王道的图片加以补充。 回忆计算机的工作过程 代码被编译器翻译成与之对等的机器指令&#xff0c;除了指令之外还会有一些数据同时被放到主存里 机器指令 指令格式 一条指令是…

第十四章 代理模式

文章目录 前言一、静态代理完整代码接口 ITeacherDao &#xff08;代理类和被代理类都需要实现这个接口&#xff09;被代理类 TeacherDao代理类 TeacherDaoProxy测试类 Client 二、JDK动态代理完整代码接口 ITeacher实现类TeacherDao代理工厂 ProxyFacyoryclient 测试 三、Cgli…