精华内容
下载资源
问答
  • "蓝色的包围盒为OBB,红色的包围盒为AABB" << endl; boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("基于惯性矩与偏心率的描述子")); ...
  • obb包围盒的中心坐标为: [-0.02476441711775762, 0.0922426968654919, -0.0011390459100575241] obb包围盒的顶点为: [[-0.08871586 0.16409617 -0.09519673] [ 0.0607272 0.06174913 -0.10044102] [-0....
  • PCL 计算点云包围盒.pdf
  • PCL PCA构建点云包围盒.pdf
  • Open3D 计算点云包围盒.pdf
  • python生成三维点云包围盒

    千次阅读 2019-09-16 15:34:19
    matplotlib生成三维点云包围盒 运行环境: win10、 python3.5.2、 matplotlib 评价:消耗时间较长 效果展示: 运行上面包围盒消耗的时间:单位(秒/s) 代码: from mpl_toolkits.mplot3d import Axes3D import ...

    matplotlib生成三维点云包围盒

    运行环境:
    win10、 python3.5.2、 matplotlib

    评价:消耗时间较长

    效果展示:
    在这里插入图片描述
    运行上面包围盒消耗的时间:单位(秒/s)
    在这里插入图片描述
    代码:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    from itertools import product, combinations
    
    import time
    import math
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.set_aspect("equal")
    
    
    start = time.time()
    # draw cube
    r = [-1, 1]
    for s, e in combinations(np.array(list(product(r, r, r))), 2):
        if np.sum(np.abs(s-e)) == r[1]-r[0]:
            ax.plot3D(*zip(s, e), color="b")
    
    print('spend_time:', time.time() - start)
    
    # draw sphere
    #u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
    #x = np.cos(u)*np.sin(v)
    #y = np.sin(u)*np.sin(v)
    #z = np.cos(v)
    #ax.plot_wireframe(x, y, z, color="r")
    
    # draw a point
    #ax.scatter([0], [0], [0], color="g", s=100)
    
    # draw a vector
    #from matplotlib.patches import FancyArrowPatch
    #from mpl_toolkits.mplot3d import proj3d
    
    
    # class Arrow3D(FancyArrowPatch):
    
        # def __init__(self, xs, ys, zs, *args, **kwargs):
            # FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
            # self._verts3d = xs, ys, zs
    
        # def draw(self, renderer):
            # xs3d, ys3d, zs3d = self._verts3d
            # xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
            # self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
            # FancyArrowPatch.draw(self, renderer)
    
    # a = Arrow3D([0, 1], [0, 1], [0, 1], mutation_scale=20,
               # lw=1, arrowstyle="-|>", color="k")
    # ax.add_artist(a)
    
    plt.show()
    
    展开全文
  • PCA构建点云包围盒

    2019-10-21 09:17:39
    评价:文章主要讲解PCA生成包围盒的原理,PCA计算点云的特征向量和特征值可以使用C++编程直接实现,也可以使用PCL点云库,或者使用Python的numpy函数实现。 注: 本文着重讲解的是PCA的原理,代码可以在...

    评价:文章主要讲解PCA生成包围盒的原理,PCA计算点云的特征向量和特征值可以使用C++编程直接实现,也可以使用PCL点云库,或者使用Python的numpy函数实现。

    注:

    本文着重讲解的是PCA的原理,代码可以在参考文章中找到。文章中很多公式在word编辑完成,并未在博客中再次编辑,望见谅。

    参考的文章:https://blog.csdn.net/qq_16775293/article/details/82801240

    首先说一下边界体的概念。边界体是用来包围一个三角网格的所有顶点,也就是将所有的三角形包围在边界体内部。同样的包围盒也是类似的将所有的点包围在一个盒子中,这个盒子也分为很多种:AABB包围盒、OBB包围盒、包围球等。本章主要讲的是OBB包围盒。

    PCA(Principal Component Analysis)主成分分析

    主成分分析可以用来计算有多个变量组成的数据集的坐标系空间,数据集的多个变量可以分成多个不相关分量,存在一个顶点位置数组中的x,y,z坐标值就是这样的数据集(点云)。数据集中最不同的方向表示主分量的基本主元。

    将每个点设为P_{i}=<x_{i},y_{i},z_{i}>,点云就看作P_{1},P_{2},P_{3},...P_{N}, N个点构成的数据集。首先利用以下公式计算位置平均数m

    在构建一个协方差矩阵C,

    协方差矩阵是由以下六个元素组成的对称矩阵:

    协方差矩阵表示x,y,z坐标值之间的相互关系。若这三个坐标值两两无关,则他们在协方差矩阵上元素的值为0,为了将所有的点集中均匀的沿着坐标轴分布,需要将协方差矩阵转换成对角阵。我们可以利用线性代数里面的内容:

                以作为该对象自然轴对应的方向,下面计算出从顶点沿X、Y、Z三个方向最大和最小位置,根据这些最大值和最小值可以容易的构建出边界盒的六个平面。

    为了确定最大和最小的范围,可以通过计算每个顶点位置坐标 P_{i} 与单位向量的内积来完成。边界盒的6个平面分别为:

    边界盒的尺寸就是X,Y,Z三个方向上相应内积的最大值与最小值之差,边界盒的中心O就是三对反向平面中三个平面的交点,令a,b,c分别为X,Y,Z上最大值与最小值的平均值:

    代码原理在参考的文章中原理简述部分已经说明,在此不再赘述。

    PCA在很多地方还可以用到,笔者觉得了协方差矩阵、特征值、特征向量的几何意义是理解PCA的关键。上述代码中还用到四元数,四元数主要用于旋转变化,在后面会再写一篇文章简述一下。

    最终代码测试的结果:

    展开全文
  • matplotlib生成三维点云包围盒运行环境:win10、 python3.5.2、 matplotlib评价:消耗时间较长效果展示:运行上面包围盒消耗的时间:单位(秒/s)代码:from mpl_toolkits.mplot3d import Axes3Dimport matplotlib....

    matplotlib生成三维点云包围盒

    运行环境:

    win10、 python3.5.2、 matplotlib

    评价:消耗时间较长

    效果展示:

    20190916153349318.png

    运行上面包围盒消耗的时间:单位(秒/s)

    20190916153433651.png

    代码:

    from mpl_toolkits.mplot3d import Axes3D

    import matplotlib.pyplot as plt

    import numpy as np

    from itertools import product, combinations

    import time

    import math

    fig = plt.figure()

    ax = fig.gca(projection='3d')

    ax.set_aspect("equal")

    start = time.time()

    # draw cube

    r = [-1, 1]

    for s, e in combinations(np.array(list(product(r, r, r))), 2):

    if np.sum(np.abs(s-e)) == r[1]-r[0]:

    ax.plot3D(*zip(s, e), color="b")

    print('spend_time:', time.time() - start)

    # draw sphere

    #u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]

    #x = np.cos(u)*np.sin(v)

    #y = np.sin(u)*np.sin(v)

    #z = np.cos(v)

    #ax.plot_wireframe(x, y, z, color="r")

    # draw a point

    #ax.scatter([0], [0], [0], color="g", s=100)

    # draw a vector

    #from matplotlib.patches import FancyArrowPatch

    #from mpl_toolkits.mplot3d import proj3d

    # class Arrow3D(FancyArrowPatch):

    # def __init__(self, xs, ys, zs, *args, **kwargs):

    # FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)

    # self._verts3d = xs, ys, zs

    # def draw(self, renderer):

    # xs3d, ys3d, zs3d = self._verts3d

    # xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)

    # self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))

    # FancyArrowPatch.draw(self, renderer)

    # a = Arrow3D([0, 1], [0, 1], [0, 1], mutation_scale=20,

    # lw=1, arrowstyle="-|>", color="k")

    # ax.add_artist(a)

    plt.show()

    展开全文
  • 使用包围盒算法对点云数据进行压缩,包含测试点云,完整的代码和实验结果截图,希望对大家有所帮助!
  • 点云包围盒AABB/OBB的生成

    千次阅读 2018-10-31 17:29:02
    本篇文章主要讲pcl中如何生成点云AABB包围盒, 参考的文章pcl官网教程:http://pointclouds.org/documentation/tutorials/moment_of_inertia.php#moment-of-inertia 教程中提供了两种包围盒的生成方法: 一种是...

    本篇文章主要讲pcl中如何生成点云AABB包围盒和OBB包围盒

    包围盒定义:

    包围体是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的主要的目的是快速进行碰撞检测。包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)等。

    这里主要介绍AABB和OBB:

            轴对齐包围盒(AABB)就是包围盒对齐坐标轴,如上图黄色的包围盒;

            有向包围盒(OBB)就是根据物体本身的几何形状来决定盒子的大小和方向,盒子无须和坐标轴垂直,这是一种最为选择最合适、紧凑的包围盒,如上图白色包围盒。

    在pcl教程中提供了两种包围盒的生成方法:

    使用 pcl::MomentOfInertiaEstimation 就可计算得到两种包围盒。

    主要代码:

    #include <pcl/features/moment_of_inertia_estimation.h>
    #include <vector>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/visualization/cloud_viewer.h>
    #include <boost/thread/thread.hpp>
    
    int main (int argc, char** argv)
    {
      if (argc != 2)
        return (0);
    //读取
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
      if (pcl::io::loadPCDFile (argv[1], *cloud) == -1)
        return (-1);
    //实例化一个Momentof...
      pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
      feature_extractor.setInputCloud (cloud);
      feature_extractor.compute ();
    //声明一些必要的变量
      std::vector <float> moment_of_inertia;
      std::vector <float> eccentricity;
      pcl::PointXYZ min_point_AABB;
      pcl::PointXYZ max_point_AABB;
      pcl::PointXYZ min_point_OBB;
      pcl::PointXYZ max_point_OBB;
      pcl::PointXYZ position_OBB;
      Eigen::Matrix3f rotational_matrix_OBB;
    //计算描述符和其他的特征
      feature_extractor.getMomentOfInertia (moment_of_inertia);
      feature_extractor.getEccentricity (eccentricity);
      feature_extractor.getAABB (min_point_AABB, max_point_AABB);
      feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
    
    //显示
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
      //addCube
      viewer->addCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");//AABB盒子
      
    Eigen::Vector3f position (position_OBB.x, position_OBB.y, position_OBB.z);
      Eigen::Quaternionf quat (rotational_matrix_OBB);
      viewer->addCube (position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");//OBB盒子
     
     viewer->setRepresentationToWireframeForAllActors();//线框模式
      viewer->resetCameraViewpoint();
    
      //addLine画线
    
      //Eigen::Vector3f p1 (min_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
      //Eigen::Vector3f p2 (min_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
      //Eigen::Vector3f p3 (max_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
      //Eigen::Vector3f p4 (max_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
      //Eigen::Vector3f p5 (min_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
      //Eigen::Vector3f p6 (min_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
      //Eigen::Vector3f p7 (max_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
      //Eigen::Vector3f p8 (max_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
    
      //p1 = rotational_matrix_OBB * p1 + position;
      //p2 = rotational_matrix_OBB * p2 + position;
      //p3 = rotational_matrix_OBB * p3 + position;
      //p4 = rotational_matrix_OBB * p4 + position;
      //p5 = rotational_matrix_OBB * p5 + position;
      //p6 = rotational_matrix_OBB * p6 + position;
      //p7 = rotational_matrix_OBB * p7 + position;
      //p8 = rotational_matrix_OBB * p8 + position;
    
      //pcl::PointXYZ pt1 (p1 (0), p1 (1), p1 (2));
      //pcl::PointXYZ pt2 (p2 (0), p2 (1), p2 (2));
      //pcl::PointXYZ pt3 (p3 (0), p3 (1), p3 (2));
      //pcl::PointXYZ pt4 (p4 (0), p4 (1), p4 (2));
      //pcl::PointXYZ pt5 (p5 (0), p5 (1), p5 (2));
      //pcl::PointXYZ pt6 (p6 (0), p6 (1), p6 (2));
      //pcl::PointXYZ pt7 (p7 (0), p7 (1), p7 (2));
      //pcl::PointXYZ pt8 (p8 (0), p8 (1), p8 (2));
    
      //viewer->addLine (pt1, pt2, 1.0, 0.0, 0.0, "1 edge");
      //viewer->addLine (pt1, pt4, 1.0, 0.0, 0.0, "2 edge");
      //viewer->addLine (pt1, pt5, 1.0, 0.0, 0.0, "3 edge");
      //viewer->addLine (pt5, pt6, 1.0, 0.0, 0.0, "4 edge");
      //viewer->addLine (pt5, pt8, 1.0, 0.0, 0.0, "5 edge");
      //viewer->addLine (pt2, pt6, 1.0, 0.0, 0.0, "6 edge");
      //viewer->addLine (pt6, pt7, 1.0, 0.0, 0.0, "7 edge");
      //viewer->addLine (pt7, pt8, 1.0, 0.0, 0.0, "8 edge");
      //viewer->addLine (pt2, pt3, 1.0, 0.0, 0.0, "9 edge");
      //viewer->addLine (pt4, pt8, 1.0, 0.0, 0.0, "10 edge");
      //viewer->addLine (pt3, pt4, 1.0, 0.0, 0.0, "11 edge");
      //viewer->addLine (pt3, pt7, 1.0, 0.0, 0.0, "12 edge");
    
      while(!viewer->wasStopped())
      {
        viewer->spinOnce (100);
        boost::this_thread::sleep (boost::posix_time::microseconds (100000));
      }
    
      return (0);
    }

    运行效果:

    展开全文
  • 2,包围盒手动实现,osg调用。 3,las转成osgb文件加载。 4,osg3.6.3显示三维,qt5.8.0做界面。 5,用了很多c++11练手。 6,utm和84之间的互转。 7,外边那个显示的是包围盒。里面是点云数据...
  • #include &lt;iostream&gt;#include &lt;pcl/io/pcd_io.h&gt;#include &lt;pcl/point_types.h&... int main(int argc, char** argv){ //定义一个点云cloud //pcl::PointCloud&lt;pcl:...
  • PCL PCA构建点云包围盒

    万次阅读 2021-04-20 20:42:32
    主成分分析法PCA构建点云包围盒
  • 通过建立点云数据的包围盒结构,对不同位置疏密不一致的点云进行抽稀和均匀化处理。
  • 可视化点云包围
  • 点云最小包围盒,最小六面体

    千次阅读 2019-10-28 22:38:49
    1代码 pcl::PointXYZRGBA min, max; pcl::getMinMax3D(*cloud_platform... //寻找cloud_box_filter的最小包围盒 pcl::MomentOfInertiaEstimation <pcl::PointXYZRGBA> feature_extractor; feature_extracto...
  • 特征值依绝对值递减排列
  • pcl为点云绘制包围盒

    2020-12-02 09:30:27
    { Eigen::Vector4f min, max; pcl::getMinMax3D(*vptr_clusters[i], min, max); visualization_msgs::Marker marker; marker.header.stamp = ros::Time::now(); marker.header.frame_id = frame_id_;...
  • 点云进行ROI区域裁剪及滤波,以降低点云数量,加快处理速度。 对预处理后的点云进行聚类分割。 对分割后的点云包围盒以确定障碍物的区域或用于三维重建。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 612
精华内容 244
关键字:

点云包围盒