点云库中的凸包计算在二维和三维都失败
Convex Hull calculation in Point Cloud Library fails in 2 as well as 3 dimensions
我正在学习PCL文档中计算2D凸包的教程,请参阅此处。
我有一个云和一些指数,把它们投影到一个给定系数的平面上,然后计算凸包。这是代码:
PointCloud<PointXYZ>::Ptr tmpInliers(new PointCloud<PointXYZ>());
ProjectInliers<PointXYZ> proj;
proj.setModelType(SACMODEL_PLANE);
proj.setInputCloud(someCloud);
proj.setIndices(someIndices);
proj.setModelCoefficients(someCoefficients);
proj.filter(*tmpInliers);
PointCloud<PointXYZ>::Ptr hull(new PointCloud<PointXYZ>());
ConvexHull<PointXYZ> chull;
chull.setInputCloud(tmpInliers);
chull.setComputeAreaVolume(true);
chull.setDimension(3); <--- see below
chull.reconstruct(*hull);
我得到的总面积和体积的结果大约是:
Area & Volume of convex hull: 7.8726e-312 2.122e-314
对于周围tmpInliers的值
(-0.80562,-0.787018,2.25184)
(-0.477351,-0.798953,2.11432)
(-0.633823,-0.750283,2.96717)
[....]
如果我将"setDimensions"更改为"2",我会得到以下错误
[pcl::ConvexHull::performReconstrution2D] ERROR: qhull was unable to compute a convex hull for the given point cloud (size of cloud)!
在下面的例子中,我正在构建一个例子,在每种情况下都会失败(将Dimension设置为2或3),其中有一个之前的失败(要么是"qhull无法…",要么是根据ConvexHull的值得出的奇怪结果。
PointCloud<PointXYZ>::Ptr hugeBox(new PointCloud<PointXYZ>());
hugeBox->push_back(PointXYZ(10, 10, 10));
hugeBox->push_back(PointXYZ(10, 10, -10));
hugeBox->push_back(PointXYZ(10, -10, 10));
hugeBox->push_back(PointXYZ(10, -10, -10));
hugeBox->push_back(PointXYZ(-10, 10, 10));
hugeBox->push_back(PointXYZ(-10, 10, -10));
hugeBox->push_back(PointXYZ(-10, -10, 10));
hugeBox->push_back(PointXYZ(-10, -10, -10));
// Project inliers onto plane model
PointCloud<PointXYZ>::Ptr hugePlane(new PointCloud<PointXYZ>());
ProjectInliers<PointXYZ> proj;
proj.setModelType(SACMODEL_PLANE);
proj.setInputCloud(hugeBox);
proj.setModelCoefficients(coefficients);
proj.filter(*hugePlane);
// get the convex hull of plane
vector<Vertices> polygonsOut;
PointCloud<PointXYZ>::Ptr hugeHull(new PointCloud<PointXYZ>());
ConvexHull<PointXYZ> chull;
chull.setInputCloud(hugePlane);
chull.setDimension(2);
chull.reconstruct(*hugeHull, polygonsOut);
我有点困在这里了。如果我将其设置为二维,为什么会失败?如果我将其设置为三维,我偶尔会发出以下警告:
qhull precision warning:
The initial hull is narrow (cosine of min. angle is 0.9999999999999991).
A coplanar point may lead to a wide facet.
我知道,如果我有一个平面投影,情况就是这样,但如何避免这种情况呢?
我不知道你使用的框架,但让我猜一猜:你正在将点投影到嵌入三维体积的平面上,对吗?三维凸包算法失败是很直接的,因为投影在平面上的点是共面的——根据定义。反过来说,即使它们被投影在嵌入三维空间的平面上,这些点也存在于三维空间中——我想。另一方面,二维凸包算法期望真实的二维点——最有可能。因此,我认为它可以通过某种映射将投影点减少到真实的二维空间,然后应用二维凸包算法。
好的,问题是PCL从系统链接到旧的libqhull(v0.5),而不是链接到新的v0.6,该版本存在但未正确链接。问题不会经常发生,但在旧版本的一些特殊情况下,比如你有一个从3d到2d的平面投影,并试图在它周围放置一个外壳。
我将向pcl人员提交一份请求,以添加对版本号的要求。
我也有同样的问题,但在将数据放在PCL_VIEWER上后,它将点云显示为一组平行线,所以当我操作平面投影时,原始数据变成了平面线,ConvelHull算法无法接受这样的输入,我仍然没有解决它。
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- C++语法差异:二维和一维数组(指针算术)
- 如何使用qt缩放三维网格
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- 用C++将三维数组转换为二维数组
- C++将三维坐标高级为二维坐标
- OpenCV将三维坐标投影到二维摄影机坐标
- 点云库中的凸包计算在二维和三维都失败
- 使用二维屏幕坐标gluUnproject获取三维模型坐标
- 在C++中的OpenGL中将坐标从三维透视投影映射到二维正投影
- 在opengl中处理三维或二维图形的点击
- 如何使用三维渲染缩放二维世界
- 在OpenGL(C++)中绘制三维场景中的二维文本
- 如何使用二维跟踪和初始三维姿态来估计三维姿态
- 取消将二维屏幕位置投影到三维世界空间
- 利用OpenCV从二维图像点计算三维世界点
- 三维相机对二维图像像素的变换效果
- 多边形点从三维到二维的正交投影,用于UV贴图
- 如何将二维图像指定给三维OpenCV Mat的平面,然后沿不同的轴提取二维Mat
- 将PCL XYZ云转换为XY(三维到二维)