- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个点云并尝试将它们缩放到相同的大小。我的第一种方法是将平方根与特征值相除:
pcl::PCA<pcl::PointNormal> pca;
pca.setInputCloud(model_cloud_ptr);
Eigen::Vector3f ev_M = pca.getEigenValues();
pca.setInputCloud(segmented_cloud_ptr);
Eigen::Vector3f ev_S = pca.getEigenValues();
double s = sqrt(ev_M[0])/sqrt(ev_S[0]);
SampleConsensusModelRegistration
喜欢
this tutorial .但是当我这样做时,我得到消息,源点/索引的数量与目标点/索引的数量不同。
pcl::PCA<pcl::PointNormal> pca;
pca.setInputCloud(model_cloud_ptr);
Eigen::Matrix3f ev_M = pca.getEigenVectors();
Eigen::Vector3f ev_M1 = ev_M.col(0);
Eigen::Vector3f ev_M2 = ev_M.col(1);
auto dist_M1 = ev_M1.maxCoeff()-ev_M1.minCoeff();
auto dist_M2 = ev_M2.maxCoeff()-ev_M2.minCoeff();
auto distM_max = std::max(dist_M1, dist_M2);
pca.setInputCloud(segmented_cloud_ptr);
Eigen::Matrix3f ev_S = pca.getEigenVectors();
Eigen::Vector3f ev_S1 = ev_S.col(0);
Eigen::Vector3f ev_S2 = ev_S.col(1);
auto dist_S1 = ev_S1.maxCoeff()-ev_S1.minCoeff();
auto dist_S2 = ev_S2.maxCoeff()-ev_S2.minCoeff();
auto distS_max = std::max(dist_S1, dist_S2);
double s = distS_max / distM_max;
最佳答案
我建议使用每个云的特征向量来识别每个变化的主轴,然后根据该轴上的每个云变化来缩放它们。在我的示例中,我使用了一个定向边界框(本征空间中的最大最小值),但主轴(本征空间中的 x 轴)的平均值或标准偏差可能是更好的指标,具体取决于应用程序。
我在函数中留下了一些调试标志,以防它们对您有帮助,但给了它们我希望您会使用的默认值。我测试了样本和金色云的可变轴拉伸(stretch)和可变旋转。这个函数应该能够处理这一切就好了。
这种方法的一个警告是,如果翘曲是轴向可变的并且翘曲导致一个轴克服另一个轴作为变化的主轴,则此函数可能会不正确地缩放云。我不确定这个边缘案例是否与您有关。只要您的云之间有统一的缩放比例,这种情况就永远不会发生。
debugFlags:debugOverlay 将使两个输入云都按比例缩放并保持各自的特征方向(允许更容易比较)。如果为 true,primaryAxisOnly 将仅使用变化的主轴来执行缩放,如果为 false,它将独立缩放所有 3 个变化轴。
功能:
void rescaleClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr& goldenCloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& sampleCloud, bool debugOverlay = false, bool primaryAxisOnly = true)
{
//analyze golden cloud
pcl::PCA<pcl::PointXYZ> pcaGolden;
pcaGolden.setInputCloud(goldenCloud);
Eigen::Matrix3f goldenEVs_Dir = pcaGolden.getEigenVectors();
Eigen::Vector4f goldenMidPt = pcaGolden.getMean();
Eigen::Matrix4f goldenTransform = Eigen::Matrix4f::Identity();
goldenTransform.block<3, 3>(0, 0) = goldenEVs_Dir;
goldenTransform.block<4, 1>(0, 3) = goldenMidPt;
pcl::PointCloud<pcl::PointXYZ>::Ptr orientedGolden(new pcl::PointCloud<pcl::PointXYZ>);
pcl::transformPointCloud(*goldenCloud, *orientedGolden, goldenTransform.inverse());
pcl::PointXYZ goldenMin, goldenMax;
pcl::getMinMax3D(*orientedGolden, goldenMin, goldenMax);
//analyze sample cloud
pcl::PCA<pcl::PointXYZ> pcaSample;
pcaSample.setInputCloud(sampleCloud);
Eigen::Matrix3f sampleEVs_Dir = pcaSample.getEigenVectors();
Eigen::Vector4f sampleMidPt = pcaSample.getMean();
Eigen::Matrix4f sampleTransform = Eigen::Matrix4f::Identity();
sampleTransform.block<3, 3>(0, 0) = sampleEVs_Dir;
sampleTransform.block<4, 1>(0, 3) = sampleMidPt;
pcl::PointCloud<pcl::PointXYZ>::Ptr orientedSample(new pcl::PointCloud<pcl::PointXYZ>);
pcl::transformPointCloud(*sampleCloud, *orientedSample, sampleTransform.inverse());
pcl::PointXYZ sampleMin, sampleMax;
pcl::getMinMax3D(*orientedSample, sampleMin, sampleMax);
//apply scaling to oriented sample cloud
double xScale = (sampleMax.x - sampleMin.x) / (goldenMax.x - goldenMin.x);
double yScale = (sampleMax.y - sampleMin.y) / (goldenMax.y - goldenMin.y);
double zScale = (sampleMax.z - sampleMin.z) / (goldenMax.z - goldenMin.z);
if (primaryAxisOnly) { std::cout << "scale: " << xScale << std::endl; }
else { std::cout << "xScale: " << xScale << "yScale: " << yScale << "zScale: " << zScale << std::endl; }
for (int i = 0; i < orientedSample->points.size(); i++)
{
if (primaryAxisOnly)
{
orientedSample->points[i].x = orientedSample->points[i].x / xScale;
orientedSample->points[i].y = orientedSample->points[i].y / xScale;
orientedSample->points[i].z = orientedSample->points[i].z / xScale;
}
else
{
orientedSample->points[i].x = orientedSample->points[i].x / xScale;
orientedSample->points[i].y = orientedSample->points[i].y / yScale;
orientedSample->points[i].z = orientedSample->points[i].z / zScale;
}
}
//depending on your next step, it may be reasonable to leave this cloud at its eigen orientation, but this transformation will allow this function to scale in place.
if (debugOverlay)
{
goldenCloud = orientedGolden;
sampleCloud = orientedSample;
}
else
{
pcl::transformPointCloud(*orientedSample, *sampleCloud, sampleTransform);
}
}
pcl::PointCloud<pcl::PointXYZ>::Ptr golden(new pcl::PointCloud<pcl::PointXYZ>);
fileIO::loadFromPCD(golden, "CT_Scan_Nov_7_fullSpine.pcd");
CloudVis::simpleVis(golden);
double xStretch = 1.75;
double yStretch = 1.65;
double zStretch = 1.5;
pcl::PointCloud<pcl::PointXYZ>::Ptr stretched(new pcl::PointCloud<pcl::PointXYZ>);
for (int i = 0; i < golden->points.size(); i++)
{
pcl::PointXYZ pt = golden->points[i];
stretched->points.push_back(pcl::PointXYZ(pt.x * xStretch, pt.y * yStretch, pt.z * zStretch));
}
Eigen::Affine3f arbRotation = Eigen::Affine3f::Identity();
arbRotation.rotate(Eigen::AngleAxisf(M_PI / 4.0, Eigen::Vector3f::UnitY()));
pcl::transformPointCloud(*stretched, *stretched, arbRotation);
CloudVis::rgbClusterVis(golden, stretched);
rescaleClouds(golden, stretched,true,false);
CloudVis::rgbClusterVis(golden, stretched);
关于c++ - PCL : Scale two Point-Clouds to the same size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395218/
我想在可移植的 C# 类中实现这个逻辑: static JsonWebToken() { HashAlgorithms = new Dictionary>
我有一个线程可以在处理点云时将其可视化。我还需要可视化法线,我该如何更新它们? 我找不到像普通云的 updateClouds 这样的东西。 void pclVisualizerThread::oper
下面的函数没有产生结果。换句话说,点云中的点数与降采样前完全相同。我尝试了从 0.01 一直到您在下面看到的那些不同的叶子大小数字,但它们都产生相同的结果。我不得不对从 pcl::PointCloud
我是 PCL 的新手。我正在使用 PCL 库,我正在寻找一种从点云中提取点或将特定点复制到新点的方法。我想验证每个点是否符合条件,我想获得一个只有好的点的点云。谢谢! 最佳答案 使用 ExtractI
我更新到了最新版本的 Xamarin,其中“完全支持”PCL。我现在如何使用 Azure 移动服务? 如果我创建 PCL 库并尝试使用 NuGet 添加它,则无法安装“Newtonsoft.Json
创建 C# Xamarin Forms 应用 添加 C# PCL 添加 F# PCL 尝试添加从 C# PCL 到 F# PCL 的引用 -> 在引用对话框中您将看到:不兼容的框架定义::NETFra
我现在正在使用一些 Laserscans,并希望在 C++ 中对 PointClouds 进行下采样。我在构建过程中遇到了一个奇怪的问题,我认为在我尝试编译代码时的库链接过程中。这里是问题似乎来自的最
我想知道这是否可能。我有一个功能: pcl::PointCloud createPointCloud(std::Vector input) 返回一个点云。我想知道是否可以获取这个点云,并制作一个指向
我正在尝试使用点云库提供的 RANSAC 方法估计通过点云点的线。我可以创建对象,并毫无问题地估计线模型,如下所示: pcl::PointCloud::ConstPtr source_cloud(ne
正在尝试使用 PCL为 mvvmcross使用 Profile 78 的 TPL (关于问题 TPL on PCL of mvvmcross) 上 iOS项目正在运行,但不适用于 android .
我使用以下命令安装了 PCL。 sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl sudo apt-get updat
PCL库中是否有任何函数可以保存pcl::PointCloud可以用Meshlab打开的XYZRGB格式的点云? 好像pcl::io::savePCDFileASCII (filename, clou
我正在尝试使用 PortableRest从 Xamarin Forms 对 Web API 2.2 Rest 服务进行异步调用。 我想我遇到了某种死锁/同步上下文问题,但我无法解决(新手到异步等)。
我正尝试在 C++ 中运行以下命令: #include #include "pcl/pcl_base.h" #include "pcl/PointIndices.h" #include "pcl/c
在 .NET 标准 PCL 项目中,我想引用一个针对配置文件 111 (lib\portable-win8+net45+wpa81+MonoAndroid+Xamarin.iOS10) 的私有(pri
我想使用 PCL 加载点云数据。我可以在教程中正确加载示例数据,但是当我尝试使用我的数据时,pcd 文件的值被更改为非常小的值。 终端输出图像 实际值类似于 3603538.71629,但当 PCL
我在创建 F# 可移植项目时遇到问题,该项目应该从 C# 可移植项目中引用。添加此类引用时,会出现以下消息: Unable to add a reference to 'PortableLibrary
操作系统:Ubuntu20.04 PCL信息: Package: libpcl-dev Version: 1.10.0+dfsg-5ubuntu1 Priority: extra Section: u
我想删除 SQLite.Net-PCL打包并想使用sqlite-net-pcl因为我后来发现SQLite.Net-PCL官方没有维护。 我的 Xamarin 项目中有一些表将 GUID 存储为字符串类
我有一些代码如下所示: typedef pcl::PointXYZRGB pcl_ColorPointType; typedef pcl::PointXYZ pcl_PointType; typede
我是一名优秀的程序员,十分优秀!