标签: point-clouds

存储ARKit点云数据并检索显示

我希望存储使用ARKit和Unity记录的点云数据,以便可以像原始记录一样检索和显示它.假设我只是简单地显示UnityPointCloudExample.cs脚本的点云数据,它包含在Unity插件中.但是,当检测到并显示某个点时,我还会存储有关该点的一些相关信息.然后我完全关闭了应用程序.当我再次打开应用程序时,我希望能够将数据重新加载到相对于相机的相同位置,就像最初检测到的那样,这是否可以使用ARKit和Unity插件原样?

我知道这需要存储有关相机位置相对于点位置的一些信息,然后在重新启动应用程序时,需要在相机重新启动时的新位置和上一个会话中的位置之间进行某种转换.记录点,然后使用此信息将点放在正确的位置.通过ARKit文档,我不确定如何使用本机界面实现这一点,而且我更不确定如何使用Unity插件实现它.如果有人能够至少指引我使用Unity插件或本机ARKit接口的元素,这些元素最容易促进上述功能的实现,我将非常感激.

或者,如果这超出了当前状态下ARKit/Unity插件的范围,解释如何以及为什么会出现这种情况同样有帮助.谢谢!

c# unity-game-engine augmented-reality point-clouds arkit

8
推荐指数
1
解决办法
1000
查看次数

Open3d - 将多个点云可视化为视频/动画

我已经使用 RGB+深度视频生成了多个点云,并且希望将多个点云可视化为视频或动画。

\n

目前我使用的是Python,我的部分代码如下:

\n
for i in range(1,10)\n       pcd = Track.create_pcd(i)\n       o3d.visualization.draw_geometries([pcd])\n       pcd_list.append(pcd)\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用draw_geometries或draw_geometries_with_animation_callback时,它们似乎无法显示点云列表:

\n
o3d.visualization.draw_geometries([pcd_list])\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
def rotate_view(vis):\n    ctr = vis.get_view_control()\n    ctr.rotate(10.0, 0.0)\n    return False\n    \no3d.visualization.draw_geometries_with_animation_callback([pcd_list],rotate_view)\n
Run Code Online (Sandbox Code Playgroud)\n

它给出了以下错误:

\n
\n

类型错误:draw_geometries():函数参数不兼容。支持\n以下参数类型:

\n
    \n
  1. (geometry_list:列表[open3d.open3d_pybind.geometry.Geometry],window_name:str = \xe2\x80\x98Open3D\xe2\x80\x99,宽度:int = 1920,高度:int = 1080,\n左:int = 50,顶部:int = 50,point_show_normal:bool = False,\ nmesh_show_wireframe:bool = False,mesh_show_back_face:bool = False)\ n->无
  2. \n
\n
\n

是否有任何示例说明如何将点云列表导出到视频中,例如设置查看器,并使用 0.5 秒的等待键显示每个点云,然后另存为视频文件(.mp4/.avi)?\n和还要获取然后设置视频中点云的固定视点?

\n

非常感谢!

\n

python video save-as point-clouds open3d

8
推荐指数
1
解决办法
2万
查看次数

将3D点云与CAD模型匹配

我有一个物体的点云,用激光扫描仪获得,以及该物体的CAD表面模型.

如何将点云与曲面相匹配,以获得云与模型之间的平移和旋转?

我想我可以对表面进行采样并尝试使用迭代最近点(ICP)算法将得到的采样点云与扫描仪点云进行匹配.

这实际上有用吗?

这项任务有更好的算法吗?

algorithm 3d computer-vision object-recognition point-clouds

7
推荐指数
2
解决办法
1万
查看次数

PCL - LUM的全球注册

我正在进行一个注册项目,我有一把椅子,一些物体在kinect前面旋转.

我可以成功配对注册,但正如预期的那样有一些漂移(导致图像).

我想使用LUM,以便对累积误差进行全局最小化(然后将其"扩展"到帧中),但我最终将帧悬浮在空中.(图片下方的代码)

LUM的使用有没有明显的错误?---我使用关键点+功能,而不是盲目地用全点云提供LUM

为什么所有示例都添加单向边而不是双向边?

在此输入图像描述

PARAM_LUM_centroidDistTHRESH = 0.30;
PARAM_LUM_MaxIterations = 100;
PARAM_LUM_ConvergenceThreshold = 0.0f;
int NeighborhoodNUMB = 2;
int FrameDistLOOPCLOSURE = 5;
PARAM_CORR_REJ_InlierThreshold = 0.020;

pcl::registration::LUM<pcl::PointXYZRGBNormal> lum;
lum.setMaxIterations(        PARAM_LUM_MaxIterations );
lum.setConvergenceThreshold( PARAM_LUM_ConvergenceThreshold );

QVector< pcl::PointCloud<pcl::PointXYZRGB>::Ptr >  cloudVector_ORGan_P_;



for (int iii=0; iii<totalClouds; iii++)
{                
        // read - iii_cloud_ORGan_P_
        // transform it with pairwise registration result
        cloudVector_ORGan_P_.append( iii_cloud_ORGan_P_ );
}

for (size_t iii=0; iii<totalClouds; iii++)
{        
    pcl::compute3DCentroid( *cloudVector_ORGan_P_[iii], centrVector[iii] );

    pcl::IntegralImageNormalEstimation<pcl::PointXYZRGB,pcl::Normal> ne;
    //blah blah parameters
    //compute normals with *ne*                            
    //pcl::removeNaNFromPointCloud
    //pcl::removeNaNNormalsFromPointCloud

    pcl::ISSKeypoint3D< …
Run Code Online (Sandbox Code Playgroud)

point-clouds point-cloud-library

7
推荐指数
1
解决办法
3167
查看次数

从许多2d图像生成点云

从我对点云如何工作的理解有限,我觉得应该能够从一个对象外部的一组二维图像中生成一个点云.我遇到的问题是我似乎无法找到如何生成这种点云的任何示例.

3d point-clouds point-cloud-library

7
推荐指数
2
解决办法
3万
查看次数

如何使用openGL显示点云

我正在尝试用点云显示OpenGL.

我已经遵循了一些教程,并设法显示一些几何模式但是当我尝试显示从csv文件中读取的点云时,它不起作用.阅读文件工作得很好.

包括

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <stdlib.h>
#include <stdio.h>
#include <boost/tokenizer.hpp>
#include <sstream>
#include <vector>

#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <algorithm>

#include "Point.cpp"
#include "drawing.cpp"

using namespace std;
Run Code Online (Sandbox Code Playgroud)

声明

void draw(vector<Point> v);

int pointsNBR = 200;

char *theFileName;
Run Code Online (Sandbox Code Playgroud)

主要方法

int main (int argc, char** argv) {

  if(argv[1]){
    theFileName = argv[1];
  }else{
    cout << "Please enter the file name !!\n";
    exit(0);
  }

  if(argv[2]){
    pointsNBR = atoi(argv[2]);
  }
  PCEngine(theFileName, pointsNBR);

    SDL_Init(SDL_INIT_VIDEO);
  atexit(SDL_Quit); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl point-clouds

7
推荐指数
1
解决办法
1万
查看次数

平面拟合在3d点云

我试图使用回归公式Z = a X + b Y + C在三维点云中找到平面

我实现最小二乘和RANSAC的解决方案,但3个参数方程限制平面拟合到2.5D-式不能在平面上施加平行于Z轴.

我的问题是如何将平面拟合推广到完整的3d?我想添加第四个参数以获得完整的方程式X + b Y + c*Z + d如何避免平凡的(0,0,0,0)解?

谢谢!

我正在使用的代码:

from sklearn import linear_model

def local_regression_plane_ransac(neighborhood):
    """
    Computes parameters for a local regression plane using RANSAC
    """

    XY = neighborhood[:,:2]
    Z  = neighborhood[:,2]
    ransac = linear_model.RANSACRegressor(
                                          linear_model.LinearRegression(),
                                          residual_threshold=0.1
                                         )
    ransac.fit(XY, Z)

    inlier_mask = ransac.inlier_mask_
    coeff = model_ransac.estimator_.coef_
    intercept = model_ransac.estimator_.intercept_
Run Code Online (Sandbox Code Playgroud)

python 3d geometry computer-vision point-clouds

7
推荐指数
1
解决办法
1万
查看次数

可视化pointcloud

我在找到的视差图像上有来自gpu :: reprojectImageTo3D的3D点.我现在想要显示这个pointcloud.

如何将找到的pointcloud转换OpenCVsensor_msgs/PointCloud2

我不需要发布pointcloud这只是用于调试可视化.是否可以像节点中的图像一样显示它?例如使用pcl?这将是最佳的,因为我的设备可能无法很好地执行RViz(基于在线阅读).

opencv point-clouds ros point-cloud-library

7
推荐指数
1
解决办法
1376
查看次数

C#和Kinect v2:将Kinect-pointcloud与3D对象的pointcloud合并

目前我正在开发一个C#项目来合并可以使用Kinect SDK从Kinect-v2设备检索的颜色和深度信息,其中包含可以从三维对象文件(.obj ,. stl,依此类推..)因此,我想创建一个像素点云,其中包含两者的信息 - 来自Kinect设备的坐标和颜色信息以及来自目标文件的信息.

到目前为止我做了什么?

  • 我设法设置了两个像素阵列Pixel[]来保存所需的数据(X/Y/Z坐标,以及相关的颜色信息RGB).
  • 一个数组包含Kinect数据,而另一个数组包含
    目标文件的数据.

    public class Pixel 
    {
         public double X { get; set; }
         public double Y { get; set; }
         public double Z { get; set; }
         public byte R { get; set; }
         public byte G { get; set; }
         public byte B { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)

为了获得颜色和深度信息以及设置Kinect数组,我首先使用Kinect-SDK的MultiSourceFrameReader类来获取MultiSourceFrame...

MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();
Run Code Online (Sandbox Code Playgroud)

..所以我可以在那之后获取颜色/深度框架:

DepthFrame depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame();
ColorFrame colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();
Run Code Online (Sandbox Code Playgroud)

通过这些方法.CopyConvertedFrameDataToArray(), …

c# 3d wpf point-clouds kinect-v2

7
推荐指数
0
解决办法
422
查看次数

努力使用 Python 中的 Open3D 从点云数据创建无懈可击的网格

我正在尝试用代表锥束 CT 图像的器官轮廓数据的点云创建一个防水网格。我的目标是获取两个网格并计算它们两个之间的相交体积。

我尝试过使用此处显示的每种方法

泊松重建

point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.compute_convex_hull()
pcd.estimate_normals()
pcd.orient_normals_consistent_tangent_plane(10)

mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=10, width=0, scale=20, linear_fit=True)[0]
mesh.compute_vertex_normals()
mesh.paint_uniform_color([0.5, 0.5, 0.5])
mesh.remove_degenerate_triangles()
o3d.visualization.draw_geometries([pcd, mesh], mesh_show_back_face=True)
Run Code Online (Sandbox Code Playgroud)

虽然这个方法在我看来似乎会产生一个水密网格,但 mesh.is_watertight() 的结果是 False,但是对于膀胱数据它返回 True。此外,该算法将网格扩展到数据垂直限制的上方和下方。虽然这并不是一个破坏交易的问题,但如果有一种方法可以最大限度地减少它,那就太好了。

泊松网格图像 泊松网格图像

球旋转

point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.compute_convex_hull()
pcd.estimate_normals()
pcd.orient_normals_consistent_tangent_plane(30)

distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radii = [0.1*avg_dist, 0.5*avg_dist, 1*avg_dist, 2*avg_dist] 
r = o3d.utility.DoubleVector(radii)
rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, r)
o3d.visualization.draw_geometries([pcd, rec_mesh], mesh_show_back_face=True)
Run Code Online (Sandbox Code Playgroud)

如果我能够填充孔,这将是我的首选方法,因为它只是连接顶点而无需插值。也许如果我能够使其进入仅剩下的孔很大的状态,我可以将该网格转换为 Pyvista 兼容的网格并使用 Pymeshfix …

python mesh point-clouds open3d

7
推荐指数
1
解决办法
3318
查看次数