我希望存储使用ARKit和Unity记录的点云数据,以便可以像原始记录一样检索和显示它.假设我只是简单地显示UnityPointCloudExample.cs脚本的点云数据,它包含在Unity插件中.但是,当检测到并显示某个点时,我还会存储有关该点的一些相关信息.然后我完全关闭了应用程序.当我再次打开应用程序时,我希望能够将数据重新加载到相对于相机的相同位置,就像最初检测到的那样,这是否可以使用ARKit和Unity插件原样?
我知道这需要存储有关相机位置相对于点位置的一些信息,然后在重新启动应用程序时,需要在相机重新启动时的新位置和上一个会话中的位置之间进行某种转换.记录点,然后使用此信息将点放在正确的位置.通过ARKit文档,我不确定如何使用本机界面实现这一点,而且我更不确定如何使用Unity插件实现它.如果有人能够至少指引我使用Unity插件或本机ARKit接口的元素,这些元素最容易促进上述功能的实现,我将非常感激.
或者,如果这超出了当前状态下ARKit/Unity插件的范围,解释如何以及为什么会出现这种情况同样有帮助.谢谢!
我已经使用 RGB+深度视频生成了多个点云,并且希望将多个点云可视化为视频或动画。
\n目前我使用的是Python,我的部分代码如下:
\nfor i in range(1,10)\n pcd = Track.create_pcd(i)\n o3d.visualization.draw_geometries([pcd])\n pcd_list.append(pcd)\nRun Code Online (Sandbox Code Playgroud)\n当我使用draw_geometries或draw_geometries_with_animation_callback时,它们似乎无法显示点云列表:
\no3d.visualization.draw_geometries([pcd_list])\nRun Code Online (Sandbox Code Playgroud)\n或者
\ndef 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)\nRun Code Online (Sandbox Code Playgroud)\n它给出了以下错误:
\n\n\n类型错误:draw_geometries():函数参数不兼容。支持\n以下参数类型:
\n\n
\n- (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->无
\n
是否有任何示例说明如何将点云列表导出到视频中,例如设置查看器,并使用 0.5 秒的等待键显示每个点云,然后另存为视频文件(.mp4/.avi)?\n和还要获取然后设置视频中点云的固定视点?
\n非常感谢!
\n我有一个物体的点云,用激光扫描仪获得,以及该物体的CAD表面模型.
如何将点云与曲面相匹配,以获得云与模型之间的平移和旋转?
我想我可以对表面进行采样并尝试使用迭代最近点(ICP)算法将得到的采样点云与扫描仪点云进行匹配.
这实际上有用吗?
这项任务有更好的算法吗?
algorithm 3d computer-vision object-recognition point-clouds
我正在进行一个注册项目,我有一把椅子,一些物体在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) 从我对点云如何工作的理解有限,我觉得应该能够从一个对象外部的一组二维图像中生成一个点云.我遇到的问题是我似乎无法找到如何生成这种点云的任何示例.
我正在尝试用点云显示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) 我试图使用回归公式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) 我在找到的视差图像上有来自gpu :: reprojectImageTo3D的3D点.我现在想要显示这个pointcloud.
如何将找到的pointcloud转换OpenCV为sensor_msgs/PointCloud2?
我不需要发布pointcloud这只是用于调试可视化.是否可以像节点中的图像一样显示它?例如使用pcl?这将是最佳的,因为我的设备可能无法很好地执行RViz(基于在线阅读).
目前我正在开发一个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(), …
我正在尝试用代表锥束 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 …