PCL StatisticalOutliersRemoval 后 1.8.1 云删除崩溃
PCL 1.8.1 crash on cloud delete after StatisticalOutliersRemoval
我有一个使用多个 DLL 文件构建的应用程序。
我正在尝试使用以下代码执行 PCL 的统计异常值删除:
PointCloudWithRGBNormalsPtr pclCloud(new PointCloudWithRGBNormals());
ConvertPointCloudToPCL(in_out_cloud /*my own structure which includes xyz, rgb, nx ny nz*/, *pclCloud);
pcl::StatisticalOutlierRemoval<PointXYZRGBNormal> sor;
sor.setInputCloud(pclCloud);
sor.setMeanK(10);
sor.setStddevMulThresh(1.0);
sor.filter(*pclCloud);
ConvertPointCloudToPCL
:
static void ConvertPointCloudToPCL(const std::vector<Cloud3DrgbN> &in, PointCloudWithRGBNormals &output)
{
for (auto it = in.begin(); it != in.end(); it++)
{
const Cloud3DrgbN &p3d = *it;;
PointXYZRGBNormal p;
p.x = p3d.x;
p.y = p3d.y;
p.z = p3d.z;
p.normal_x = p3d.nX;
p.normal_y = p3d.nY;
p.normal_z = p3d.nZ;
p.r = p3d.r;
p.g = p3d.g;
p.b = p3d.b;
output.push_back(p);
}
}
出于某种原因,如果我从我的 1 个 dll 中调用此函数,它会正常工作。但是,有 1 个 dll,如果我从中调用它,当 pclCloud
超出范围时,我在 handmade_aligned_free
的 Eigen
的 Memory.h
文件中得到一个异常] 函数
我正在使用 Windows 10 64 位,pcl 1.8.1 和 Eigen 3.3(试过 3.3.4,同样的东西)
更新:
进一步挖掘后,我发现 EIGEN_MALLOC_ALREADY_ALIGNED
被设置为 0,因为我在我的 "problematic" DLL 中使用了 AVX2
。我仍然不确定为什么使用 Eigen 的 "handmade" 对齐 malloc/free 会导致此崩溃。
Eigen、PCL 和 AVX
似乎存在一个已知问题(参见 this)
嗯,我找到了问题以及如何解决它。
windows 的 "All in 1 installer" 附带的 DLL 似乎没有在 AVX/AVX2
支持下编译。
将这些库与我自己的 DLL(使用 AVX
编译的 DLL)链接时,这种不匹配导致 Eigen
使用不同类型的分配和释放内存,从而导致崩溃。
我使用 AVX2
从源代码编译了 PCL 并链接了这些库,一切正常。
值得一提的是,之前工作的 DLL 现在有问题,因为它没有 AVX,PCL 现在有。
我有一个使用多个 DLL 文件构建的应用程序。 我正在尝试使用以下代码执行 PCL 的统计异常值删除:
PointCloudWithRGBNormalsPtr pclCloud(new PointCloudWithRGBNormals());
ConvertPointCloudToPCL(in_out_cloud /*my own structure which includes xyz, rgb, nx ny nz*/, *pclCloud);
pcl::StatisticalOutlierRemoval<PointXYZRGBNormal> sor;
sor.setInputCloud(pclCloud);
sor.setMeanK(10);
sor.setStddevMulThresh(1.0);
sor.filter(*pclCloud);
ConvertPointCloudToPCL
:
static void ConvertPointCloudToPCL(const std::vector<Cloud3DrgbN> &in, PointCloudWithRGBNormals &output)
{
for (auto it = in.begin(); it != in.end(); it++)
{
const Cloud3DrgbN &p3d = *it;;
PointXYZRGBNormal p;
p.x = p3d.x;
p.y = p3d.y;
p.z = p3d.z;
p.normal_x = p3d.nX;
p.normal_y = p3d.nY;
p.normal_z = p3d.nZ;
p.r = p3d.r;
p.g = p3d.g;
p.b = p3d.b;
output.push_back(p);
}
}
出于某种原因,如果我从我的 1 个 dll 中调用此函数,它会正常工作。但是,有 1 个 dll,如果我从中调用它,当 pclCloud
超出范围时,我在 handmade_aligned_free
的 Eigen
的 Memory.h
文件中得到一个异常] 函数
我正在使用 Windows 10 64 位,pcl 1.8.1 和 Eigen 3.3(试过 3.3.4,同样的东西)
更新:
进一步挖掘后,我发现 EIGEN_MALLOC_ALREADY_ALIGNED
被设置为 0,因为我在我的 "problematic" DLL 中使用了 AVX2
。我仍然不确定为什么使用 Eigen 的 "handmade" 对齐 malloc/free 会导致此崩溃。
Eigen、PCL 和 AVX
似乎存在一个已知问题(参见 this)嗯,我找到了问题以及如何解决它。
windows 的 "All in 1 installer" 附带的 DLL 似乎没有在 AVX/AVX2
支持下编译。
将这些库与我自己的 DLL(使用 AVX
编译的 DLL)链接时,这种不匹配导致 Eigen
使用不同类型的分配和释放内存,从而导致崩溃。
我使用 AVX2
从源代码编译了 PCL 并链接了这些库,一切正常。
值得一提的是,之前工作的 DLL 现在有问题,因为它没有 AVX,PCL 现在有。