我的3D扫描仪从不同的角度扫描一些物体,最终得到360°的表面重建.每次扫描的点云具有不同的点数,需要合并.在我想用于重建的PCL库中,存在使用一些迭代最近点方法来合并具有相同数量的点的点云的算法.
我想避免找出旋转轴.当然,知道它的位置和旋转角度,我可以将一个云的所有点与旋转矩阵相乘,然后合并云.有没有办法在不知道旋转中心的情况下合并它们?(甚至可能从算法中获得它的位置?)
我有一个3D笛卡尔立方体.对于此立方体中的每个点,都有相应的密度值.当密度突然变化时,意味着存在空腔.现在找到空腔,我计算立方体中每个点的梯度.这给了我一个腔表面上的点云.我现在想在给定点云的情况下对腔体表面进行网格划分.
不幸的是,我没有任何表面重建的经验,并且想知道是否有人可以推荐一种合适的算法来产生一个封闭的腔体表面?
立方体非常大,因此腔体表面的点云可以很容易地达到500,000点或更多.我读过这篇文章:从3D点云进行曲面重建的鲁棒算法?我认为有用.然而,似乎我面临的问题更简单,因为:
我想知道是否有任何方法可以创建一个可以在RANSAC方案中使用的模型,其中样条或折线可以从嘈杂的三维点云中确定.
我所拥有的是一个包含每个xy平面中的一组点的体积,在z方向上有400个这样的点,并且在简单地查看3d空间中的绘制数据时可视地出现样条形状.我已经有了一个线性拟合RANSAC方案,其中误差由一个简单的距离测量确定,但我无法理解如何确定样条曲线/折线的模型.
我正在使用PLYLoader加载.ply文件,并使用three.js中的PointCloud对象进行渲染.
var loader = new THREE.PLYLoader();
loader.addEventListener('load', function (event) {
var geometry = event.content;
var material = new THREE.PointCloudMaterial({ vertexColors: true, size: 0.01 });
var mesh = new THREE.PointCloud(geometry, material);
scene.add(mesh);
});
loader.load(file_url);
Run Code Online (Sandbox Code Playgroud)
它工作正常,点数正确呈现.但是这些点呈现为正方形.是否可以将它们更改为圆形?如果是这样,怎么样?
我发现这个旧线程显示了一个three.js样本的图片.我们可以清楚地看到圈子.然而,今天相同的样本显示了正方形(在他们将ParticleSystem更改为PointCloud之后).
谢谢
我正在尝试找到一种简单的算法来查找两组2D点(注册)之间的对应关系。一组包含我要查找的对象的模板,第二组主要包含属于感兴趣对象的点,但是它可能很嘈杂(缺少点以及不属于该对象的其他点) 。两组都包含约40个2D点。第二组是第一组的单应性(平移,旋转和透视变换)。
我对寻找一种注册算法以获取点对应感兴趣。我将使用此信息来查找两组之间的转换(所有这些都在OpenCV中)。
谁能建议可以完成这项工作的算法,库或少量代码?当我处理小集合时,不必对其进行超级优化。目前,我的方法是类似于RANSAC的算法:
有任何想法吗?感谢您的输入。
我正在使用华硕Xtion PRO LIVE相机订阅turtlebot(深度学习版)上的主题"/camera/depth/points"
和消息PointCloud2
.
我在gazebo模拟器环境下使用了下面的python脚本,我可以成功接收x,y,z和rgb值.
但是,当我在机器人中运行它时,缺少rgb值.
这是我的turtlebot版本或相机的问题还是我必须指定我想要接收的地方PointCloud2 type="XYZRGB"
?还是同步问题?有任何线索,谢谢!
#!/usr/bin/env python
import rospy
import struct
import ctypes
import sensor_msgs.point_cloud2 as pc2
from sensor_msgs.msg import PointCloud2
file = open('workfile.txt', 'w')
def callback(msg):
data_out = pc2.read_points(msg, skip_nans=True)
loop = True
while loop:
try:
int_data = next(data_out)
s = struct.pack('>f' ,int_data[3])
i = struct.unpack('>l',s)[0]
pack = ctypes.c_uint32(i).value
r = (pack & 0x00FF0000)>> 16
g = (pack & 0x0000FF00)>> 8
b = (pack & 0x000000FF)
file.write(str(int_data[0])+","+str(int_data[1])+","+str(int_data[2])+","+str(r)+","+str(g)+","+str(b)+"\n")
except Exception as e: …
Run Code Online (Sandbox Code Playgroud) 我遇到的问题是我必须计算形状之间的欧几里德距离矩阵,其范围从20,000到60,000点,产生10-20GB的数据量.我必须运行这些计算中的每一个数千次,所以20GB x 7,000(每个计算是一个不同的点云).形状可以是2D或3D.
已编辑(更新的问题)
是否有更有效的方法来计算前向和后向距离而不使用两个单独的嵌套循环?
我知道我可以保存数据矩阵并计算每个方向的最小距离,但是大点云存在巨大的内存问题.
有没有办法加快计算速度和/或清理代码以缩短时间?
具有讽刺意味的是,我只需要矩阵来计算一个非常简单的度量,但它需要整个矩阵才能找到该度量(Average Hausdorff distance).
数据示例,其中每列表示形状的尺寸,每行是形状中的一个点:
first_configuration <- matrix(1:6,2,3)
second_configuration <- matrix(6:11,2,3)
colnames(first_configuration) <- c("x","y","z")
colnames(second_configuration) <- c("x","y","z")
Run Code Online (Sandbox Code Playgroud)
此代码计算坐标之间的欧几里德距离:
m <- nrow(first_configuration)
n <- nrow(second_configuration)
D <- sqrt(pmax(matrix(rep(apply(first_configuration * first_configuration, 1, sum), n), m, n, byrow = F) + matrix(rep(apply(second_configuration * second_configuration, 1, sum), m), m, n, byrow = T) - 2 * first_configuration %*% t(second_configuration), 0))
D
Run Code Online (Sandbox Code Playgroud)
输出:
[,1] [,2]
[1,] 8.660254 10.392305
[2,] 6.928203 8.660254
Run Code Online (Sandbox Code Playgroud)
编辑:包括hausdorff平均代码
d1 <- mean(apply(D, 1, min))
d2 <- …
Run Code Online (Sandbox Code Playgroud) 我正在与 PCL 合作处理点云,最终检测场景中的对象。
我添加了一个自定义 PiontT 类型,它对我来说工作得很好。然而,我在 PCL 库中的过滤算法上遇到了困难。我尝试了统计、半径和条件异常值去除来消除噪音。统计数据没有返回结果(在我看来,好像处于无限循环中),另一方面,半径返回大小为 0 的云。而条件实际上返回相同的云,而不删除任何点。在半径和统计方面,我按照给出的示例进行操作,但它们不起作用。
目前,我认为条件删除对我来说是最合适的算法,因为我想自信地删除不在 [0.4 - 1] 范围内的任何点。正如我之前提到的,我使用的是自定义点类型。下面是点类型 (Tango3DPoitType) 的代码以及使用条件删除的方法。
Tango3DPoitType.h
#define PCL_NO_PRECOMPILE
#include <pcl/point_types.h>
#include <pcl/impl/point_types.hpp>
#include <pcl/point_cloud.h>
#include <pcl/impl/instantiate.hpp>
// Preserve API for PCL users < 1.4
#include <pcl/common/distances.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/kdtree/impl/kdtree_flann.hpp>
#include <pcl/search/organized.h>
#include <pcl/search/impl/organized.hpp>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/impl/statistical_outlier_removal.hpp>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/impl/radius_outlier_removal.hpp>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/impl/voxel_grid.hpp>
#include <pcl/filters/voxel_grid_covariance.h>
#include <pcl/filters/impl/voxel_grid_covariance.hpp>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/impl/extract_indices.hpp>
#include <pcl/filters/conditional_removal.h>
#include <pcl/filters/impl/conditional_removal.hpp>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/impl/sac_segmentation.hpp>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/segmentation/impl/extract_clusters.hpp> …
Run Code Online (Sandbox Code Playgroud) 我正在使用PCL 分段模块中的 SACSegmentation来过滤掉地平面。
该方法是拟合 3D 对象的前表面,而不是拟合地平面,如下面的第二个 pcd 文件所示。
有什么建议我应该做什么才能适应和过滤地平面点。
提前致谢。
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::SACSegmentation<pcl::PointXYZ> segmentation;
segmentation.setInputCloud(cloudAll);
segmentation.setOptimizeCoefficients(true);
segmentation.setModelType(pcl::SACMODEL_PLANE );
segmentation.setMethodType(pcl::SAC_RANSAC );
segmentation.setDistanceThreshold(20.20);
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 matlab 中实现一个函数来计算截断的有符号距离函数,以便使用类似于本文中描述的方法从点云渲染体积模型。谁能帮我?提前致谢。
point-clouds ×10
3d ×5
ransac ×2
2d ×1
algorithm ×1
c++ ×1
javascript ×1
matlab ×1
opencv ×1
point ×1
polygon ×1
python ×1
r ×1
rcpp ×1
rcppparallel ×1
registration ×1
rgb ×1
ros ×1
three.js ×1