精华内容
下载资源
问答
  • Meshlab是一个强大的三维模型处理的软件,在三维点云的处理方面也十分强大,不仅仅可以用三维点云重构出三维模型,还可以计算出三维点云每个点的法向量,这在逆向工程和基于三维点云的隐式曲面重建中非常有用。...

    Meshlab是一个强大的三维模型处理的软件,在三维点云的处理方面也十分强大,不仅仅可以用三维点云重构出三维模型,还可以计算出三维点云每个点的法向量,这在逆向工程和基于三维点云的隐式曲面重建中非常有用。

       我的Meshlab的版本是3.3,可以在网上自行下载。

    1.Meshlab读取三维点云

    第一步:打开Meshlab软件

     

    第二步:点击File菜单下的ImportMesh导入txt文档,需要选择你的txt文档中XYZ坐标之间的分隔符,导入成功后会显示你的三维点云数据

     

    2.三维点云重建

    点击下图图标,弹出右侧图层侧边栏

     

    然后点击Fiter菜单下Normals,Curtavures and Oreientation下的Smooths normals on a point set计算三维点云的法向量,如下图

     

    然后设置计算点云法向量的参数,默认就好,如有需要可以自行设置,点击Apply等计算完成然后点击Close关闭对话框

     

    计算完点击法向量之后,点击Filter菜单下Remeshing Simplication and Reconstruction下的Surface Reconstruction:Ball Pivoting进行三维点云重建

     

    然后设置三维点云重建参数,默认就好,也可以自行设置,点击Apply等重建完成,点击close关闭对话框

     

    然后点击下列图标显示重建的三维模型,也可以设置光照等其他参数

     

    以下为三维重建结果

     

     

    3.法向量的导出与计算

    三维点云的法向量的导出与计算有两种方式,一种是在上一节三维重建中我们已经得到了重建后的三维模型,那么每个点都带有法向量,可以直接导出即可,还有一种就是从杂乱的三维点中计算每一个三维点的法向量

    3.1从三维模型中导出三维点云中每个点的法向量

    接着第二节的步骤,点击File菜单下Export Mesh as 

     

    然后在接下来的对话框中选择xyz格式

     

    然后在 接下来的对话框中勾选Normal就可以生成文本格式的三维点以及三维点法向量

     

    以下为文本格式的三维点坐标以及三维点法向量的结果

     

    3.2 直接从三维散乱点云中生成三维点的法向量

    然后点击Filter菜单下Normals,Curtavures and Oreientation下的Compute normals for point set计算三维点云的法向量,如下图

     

    在弹出来的对话框可以自行设置参数,先Apply然后再Close

     

    法向量的导出与3.1中的一样,可以自行参考。

     

    以下为三维点云以及点云的法向量的可视化结果,点云表示为红色的点,法向量表示为绿色的线段

    如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

     

    展开全文
  • Meshlab是一个强大的三维模型处理的软件,在三维点云的处理方面也十分强大,不仅仅可以用三维点云重构出三维模型,还可以...

    Meshlab是一个强大的三维模型处理的软件,在三维点云的处理方面也十分强大,不仅仅可以用三维点云重构出三维模型,还可以计算出三维点云每个点的法向量,这在逆向工程和基于三维点云的隐式曲面重建中非常有用。

       我的Meshlab的版本是3.3,可以在网上自行下载破解版。

    1.Meshlab读取三维点云

    第一步:打开Meshlab软件



    第二步:点击File菜单下的ImportMesh导入txt文档,需要选择你的txt文档中XYZ坐标之间的分隔符,导入成功后会显示你的三维点云数据





    2.三维点云重建

    点击下图图标,弹出右侧图层侧边栏



    然后点击Fiter菜单下Normals,Curtavures and Oreientation下的Smooths normals on a point set计算三维点云的法向量,如下图



    然后设置计算点云法向量的参数,默认就好,如有需要可以自行设置,点击Apply等计算完成然后点击Close关闭对话框



    计算完点击法向量之后,点击Filter菜单下Remeshing Simplication and Reconstruction下的Surface Reconstruction:Ball Pivoting进行三维点云重建



    然后设置三维点云重建参数,默认就好,也可以自行设置,点击Apply等重建完成,点击close关闭对话框



    然后点击下列图标显示重建的三维模型,也可以设置光照等其他参数



    以下为三维重建结果




    3.法向量的导出与计算

    三维点云的法向量的导出与计算有两种方式,一种是在上一节三维重建中我们已经得到了重建后的三维模型,那么每个点都带有法向量,可以直接导出即可,还有一种就是从杂乱的三维点中计算每一个三维点的法向量

    3.1从三维模型中导出三维点云中每个点的法向量

    接着第二节的步骤,点击File菜单下Export Mesh as 



    然后在接下来的对话框中选择xyz格式



    然后在 接下来的对话框中勾选Normal就可以生成文本格式的三维点以及三维点法向量



    以下为文本格式的三维点坐标以及三维点法向量的结果



    3.2 直接从三维散乱点云中生成三维点的法向量

    然后点击Filter菜单下Normals,Curtavures and Oreientation下的Compute normals for point set计算三维点云的法向量,如下图



    在弹出来的对话框可以自行设置参数,先Apply然后再Close



    法向量的导出与3.1中的一样,可以自行参考。


    以下为三维点云以及点云的法向量的可视化结果,点云表示为红色的点,法向量表示为绿色的线段

    转:https://blog.csdn.net/HW140701/article/details/72778116

    展开全文
  • ToF三维点云重建

    2018-01-27 19:00:09
    ToF sensor 导出的数据进行三维重建,根据激光从出发到经过散射之后到目标物再被探测器接收到这个时间信息来求解目标物的位置和立体形状扫描足够多的点的时候,就能够得到目标物上的做够多的点的距离值,只有可以...
  • 双目立体视差图进行三维点云重建【OpenCV3.4.1+PCL1.8】 CODE 基于双目立体视差图进行三维点云的重建,并提供PFM文件转成Mat格式的接口。点云重建过程清晰明了、内含所需的所有文件,详情见:...

    旷视研究院SLAM组负责人刘骁:三维视觉与机器人

     

     

     

    双目立体视差图进行三维点云重建【OpenCV3.4.1+PCL1.8】

    CODE

    基于双目立体视差图进行三维点云的重建,并提供PFM文件转成Mat格式的接口。点云重建过程清晰明了、内含所需的所有文件,详情见:https://mp.csdn.net/mdeditor/86644361

     

     

    传统的三维重建算法.jpg [1]

     

     

    Reference 

    [1] https://blog.csdn.net/Yong_Qi2015/article/details/104438375

     

     

     

     

     

     

     

     

     

    展开全文
  • 基于SfM实现视觉稀疏三维点云重建,完整的工程文件,内含所需图片,可直接运行。环境:Win10+VS2015+OpenCV3.4+PLC1.8。
  • 基于增量式SfM实现多视图三维点云重建,完整的工程文件,内含所需图片,可直接运行。环境:Win10+VS2015+OpenCV3.4+PLC1.8。
  • 在SfM多视图三维点云重建–【VS2015+OpenCV3.4+PCL1.8】中实现的增量式SfM三维点云重建,会随着图片数量的增加而导致误差逐渐累积,最后可能无法完成重建。在三维重建中常使用Bundle Adjustment(BA)优化来解决这个...
    前言

    SfM多视图三维点云重建–【VS2015+OpenCV3.4+PCL1.8】中实现的增量式SfM三维点云重建,会随着图片数量的增加而导致误差逐渐累积,最后可能无法完成重建。在三维重建中常使用Bundle Adjustment(BA)优化来解决这个问题,BA优化是一种应用广泛的非线性优化方法,其本质属于非线性最小二乘问题,目的是找到使得重投影误差最小的3D点位置和相机参数。这里对BA原理就不再赘述,而是使用Ceres Solver对SfM三维重建后的内外参、点云进行BA优化。

    代码

    环境:VS2015+OpenCV3.4+PCL1.8+Ceres Solver

    首先定义重投影误差作为待优化的代价函数,即计算三维空间点的重投影(世界坐标系到像素坐标系),并计算重投影误差,这部分有很多种形式,但都大同小异。这里ceres::AngleAxisRotatePoint(r, pos3d, pos_proj)将空间点pos3d进行旋转变换(旋转向量r)得到pos_proj,另外,注意添加如下定义和头文件,否则会报错。

    #ifndef GLOG_NO_ABBREVIATED_SEVERITIES
    #define GLOG_NO_ABBREVIATED_SEVERITIES
    #endif
    #include <ceres/ceres.h>
    #include <ceres/rotation.h>
    
    // 代价函数
    struct ReprojectCost
    {
    	cv::Point2d observation;
    
    	ReprojectCost(cv::Point2d& observation) : observation(observation){}
    
    	// 参数:内参、外参、三维点、反向投影误差
    	template <typename T>
    	bool operator()(const T* const intrinsic, const T* const extrinsic, const T* const pos3d, T* residuals) const 
    	{
    		const T* r = extrinsic;
    		const T* t = &extrinsic[3];
    		
    		// 外参数矩阵:转到相机坐标系
    		// Apply the camera rotation
    		T pos_proj[3];
    		ceres::AngleAxisRotatePoint(r, pos3d, pos_proj);
    
    		// Apply the camera translation
    		pos_proj[0] += t[0];
    		pos_proj[1] += t[1];
    		pos_proj[2] += t[2];
    
    		const T x = pos_proj[0] / pos_proj[2]; // 归一化相机坐标
    		const T y = pos_proj[1] / pos_proj[2];
    		
    		// 内参数矩阵:转到像素坐标系
    		const T fx = intrinsic[0];
    		const T fy = intrinsic[1];
    		const T cx = intrinsic[2];
    		const T cy = intrinsic[3];
    
    		// Apply intrinsic
    		const T u = fx * x + cx;
    		const T v = fy * y + cy;
    		
    		// 计算重投影误差
    		residuals[0] = u - T(observation.x);
    		residuals[1] = v - T(observation.y);
    
    		return true;
    	}
    };
    

    接下来使用Ceres Solver求解BA,前两张图片的BA优化函数如下:

    /*
    main函数中添加:
    	// BA优化
    	Mat intrinsic(Matx41d(K.at<double>(0, 0), K.at<double>(1, 1), K.at<double>(0, 2), K.at<double>(1, 2)));
    
    	Mat extrinsic(6, 1, CV_64FC1);
    	Mat r;
    	Rodrigues(R, r);
    	r.copyTo(extrinsic.rowRange(0, 3));// [0,3)
    	t.copyTo(extrinsic.rowRange(3, 6));
    
    	bundle_adjustment(intrinsic, extrinsic, points1, points3D);
    */
    void bundle_adjustment(Mat& intrinsic, Mat& extrinsics, vector<Point2d>& points, vector<Point3d>& points3D)
    {
    	ceres::Problem problem;
    
    	// load extrinsics (rotations and motions)
    	problem.AddParameterBlock(extrinsics.ptr<double>(), 6);
    
    	// fix the first camera.
    	problem.SetParameterBlockConstant(extrinsics.ptr<double>());
    
    	// load intrinsic
    	problem.AddParameterBlock(intrinsic.ptr<double>(), 4); // fx, fy, cx, cy
    
    	// load points
    	ceres::LossFunction* loss_function = new ceres::HuberLoss(4);   // loss function make bundle adjustment robuster.
    	
    	for (size_t i = 0; i < points3D.size(); i++)
    	{
    		Point2d observed = points[i];
    
    		// 模板参数:代价函数的类型、代价的维度、代价函数第一、第二、第三个参数的维度
    		ceres::CostFunction* cost_function = new ceres::AutoDiffCostFunction<ReprojectCost, 2, 4, 6, 3>(new ReprojectCost(observed));
    
    		problem.AddResidualBlock(
    			cost_function,
    			loss_function,
    			intrinsic.ptr<double>(),      // Intrinsic
    			extrinsics.ptr<double>(),  // View Rotation and Translation
    			&(points3D[i].x)			  // Point in 3D space
    		);
    	}
    
    	// Solve BA
    	ceres::Solver::Options ceres_config_options;
    	ceres_config_options.minimizer_progress_to_stdout = false;
    	ceres_config_options.logging_type = ceres::SILENT;
    	ceres_config_options.num_threads = 1;
    	ceres_config_options.preconditioner_type = ceres::JACOBI;
    	ceres_config_options.linear_solver_type = ceres::SPARSE_SCHUR;
    	ceres_config_options.sparse_linear_algebra_library_type = ceres::EIGEN_SPARSE;
    
    	ceres::Solver::Summary summary;
    	ceres::Solve(ceres_config_options, &problem, &summary);
    
    	if (!summary.IsSolutionUsable())
    	{
    		std::cout << "Bundle Adjustment failed." << std::endl;
    	}
    	else
    	{
    		// Display statistics about the minimization
    		std::cout << std::endl
    			<< "Bundle Adjustment statistics (approximated RMSE):\n"
    			<< " #views: 0\n"
    			<< " #num_residuals: " << summary.num_residuals << "\n"
    			<< " Initial RMSE: " << std::sqrt(summary.initial_cost / summary.num_residuals) << "\n"
    			<< " Final RMSE: " << std::sqrt(summary.final_cost / summary.num_residuals) << "\n"
    			<< " Time (s): " << summary.total_time_in_seconds << "\n"
    			<< std::endl;
    	}
    }
    

    如下两图是前两张图片BA优化前后的结果,虽然直观上来看,两者并没有什么太大的区别。但是根据BA优化后的统计信息可知,BA优化前重投影的三维点与真实点平均偏移11.68个像素,优化后两者几乎没有偏差(RMSE = 0),可见还是有了很大的改善。

    BA优化后统计信息:

    多张图片BA优化函数:

    /*
    main函数中添加:
    	// BA优化
    	Mat intrinsic(Matx41d(K.at<double>(0, 0), K.at<double>(1, 1), K.at<double>(0, 2), K.at<double>(1, 2)));
    	vector<Mat> extrinsics;
    	for (size_t i = 0; i < rotations.size(); ++i)
    	{
    		Mat extrinsic(6, 1, CV_64FC1);
    		Mat r;
    		Rodrigues(rotations[i], r);
    
    		r.copyTo(extrinsic.rowRange(0, 3));
    		translations[i].copyTo(extrinsic.rowRange(3, 6));
    
    		extrinsics.push_back(extrinsic);
    	}
    
    	bundle_adjustment(intrinsic, extrinsics, correspond_struct_idx, key_points_for_all, points3D);
    */
    void bundle_adjustment(Mat& intrinsic, vector<Mat>& extrinsics, vector<vector<int>>& correspond_struct_idx, vector<vector<KeyPoint>>& key_points_for_all, vector<Point3d>& structure)
    {
    	// 构建问题,求解
    	ceres::Problem problem;
    
    	// load extrinsics
    	for (size_t i = 0; i < extrinsics.size(); ++i)
    	{
    		problem.AddParameterBlock(extrinsics[i].ptr<double>(), 6);
    	}
    	// load intrinsic
    	problem.AddParameterBlock(intrinsic.ptr<double>(), 4); // fx, fy, cx, cy
    
    	// fix the first camera.
    	problem.SetParameterBlockConstant(extrinsics[0].ptr<double>());
    
    	// 添加初始点
    	ceres::LossFunction* loss_function = new ceres::HuberLoss(4);   // loss function make bundle adjustment robuster.
    	for (size_t img_idx = 0; img_idx < correspond_struct_idx.size(); ++img_idx)
    	{
    		vector<int>& point3d_ids = correspond_struct_idx[img_idx];
    		vector<KeyPoint>& key_points = key_points_for_all[img_idx];
    		for (size_t point_idx = 0; point_idx < point3d_ids.size(); ++point_idx)
    		{
    			int point3d_id = point3d_ids[point_idx];
    			if (point3d_id < 0)
    				continue;
    
    			Point2d observed = key_points[point_idx].pt;
    
    			// 模板参数:代价函数的类型、代价的维度、代价函数第一、第二、第三个参数的维度
    			ceres::CostFunction* cost_function = new ceres::AutoDiffCostFunction<ReprojectCost, 2, 4, 6, 3>(new ReprojectCost(observed));
    
    			problem.AddResidualBlock(
    				cost_function,
    				loss_function,
    				intrinsic.ptr<double>(),            // Intrinsic
    				extrinsics[img_idx].ptr<double>(),  // View Rotation and Translation
    				&(structure[point3d_id].x)          // Point in 3D space
    			);
    		}
    	}
    
    	// 设置优化策略
    	ceres::Solver::Options ceres_config_options;
    	ceres_config_options.minimizer_progress_to_stdout = false;
    	ceres_config_options.logging_type = ceres::SILENT;
    	ceres_config_options.num_threads = 1;
    	ceres_config_options.preconditioner_type = ceres::JACOBI;
    	ceres_config_options.linear_solver_type = ceres::SPARSE_SCHUR;
    	ceres_config_options.sparse_linear_algebra_library_type = ceres::EIGEN_SPARSE;
    
    	// 求解
    	ceres::Solver::Summary summary;
    	ceres::Solve(ceres_config_options, &problem, &summary);
    
    	// 打印结果
    	if (!summary.IsSolutionUsable())
    	{
    		std::cout << "Bundle Adjustment failed." << std::endl;
    	}
    	else
    	{
    		// Display statistics about the minimization
    		std::cout << std::endl
    			<< "Bundle Adjustment statistics (approximated RMSE):\n"
    			<< " #views: " << extrinsics.size() << "\n"
    			<< " #num_residuals: " << summary.num_residuals << "\n"
    			<< " Initial RMSE: " << std::sqrt(summary.initial_cost / summary.num_residuals) << "\n"
    			<< " Final RMSE: " << std::sqrt(summary.final_cost / summary.num_residuals) << "\n"
    			<< " Time (s): " << summary.total_time_in_seconds << "\n"
    			<< std::endl;
    	}
    }
    

    多张图片BA优化结果:

    多图BA优化后统计信息:
    多张图片经BA优化后,RMSE也由3.96降到2.23。
    参考
    1. ceres求解PnP–SLAM 十四讲第七章课后题,有助于理解代价函数的定义。
    2. OpenCV实现SfM(四):Bundle Adjustment
    3. 下载:SfM三维重建:BA优化【VS2015+OpenCV3.4+PCL1.8+Ceres Solver】
    展开全文
  • 结构光三维成像是近年来三维成像领域的研究...最后利用提出的方法对石膏模型和实际人脸面部进行了三维测量和重建,并分析了该方法测量的精度。结果表明提出的方法达到了实验精度的要求并取得了非常好的三维重构效果。
  • opencv实现三维点云重建

    万次阅读 2018-05-23 19:33:00
    //通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的投影点  projectPoints(tempPointSet, rvecsMat[i], tvecsMat[i], cameraMatrix, distCoeffs, image_points2); //计算新的投影点和旧...
  • opencv单目相机三维点云重建(附代码)

    万次阅读 多人点赞 2018-05-25 16:42:46
    //重建部分 Mat_<double> E = Mat(K.t()) * F * Mat(K); SVD svd(E); Matx33d W(0, -1, 0,//HZ 9.13 1, 0, 0, 0, 0, 1); Mat_<double> R = svd.u * Mat(W) * svd.vt; //HZ 9.19 Mat_...
  • 一、双目三维重建(binocular stereo):输入左右两张图片 二、SFM(Structure from Motion)运动推断结构:一系列不同视角图片 三、MVS(Multi View Stereo)多视图立体:一系列不同视角图片 一、双目相机重建步骤...
  • 三维重建分为基于
  • 在完成两视图三维重建之后,接下来就是进行多视图重建。多视图重建的难点在于如何确定后一个相机到世界坐标系的变换矩阵。
  • 将一个从2D图像生成的点云模型从不同视角进行观察,各个视角的观察都应该符合该模型在对应视角下的投影,这就是循环一致性损失函数的核心思想 不需要真值进行监督的代价就是需要复杂的损失函数补充这种监督信息,...
  • 针对三维点云数据重建效率低、不能实时交互等问题,利用鲁棒性强的Power Crust算法和三维可视化类库Visualization Toolkit(VTK)的良好并行机制与强大的图像处理能力,实现了三维点云数据曲面快速重建。该算法使用...
  • 三维点云图像重建

    千次阅读 2018-03-02 14:44:20
    因为在三维点云曲面重建中,Delaunay条件不在满足,不仅基于最大最小角判断的对角线交换准则不在成立,而且基于外接圆判据的Delaunay三角化也不能保证网格质量。VTKSurfaceReconstructionFilter则实现了一种隐式曲面...
  • 点云重建vtkSurfaceReconstructionFilter实现了一种隐式曲面重建的方法,即将曲面看作一个符号距离函数的等值面,曲面内外的距离值得符号函数相反,则零等值面即为所求的曲面。该方法需要对点云数据进行网格划分,...
  • vtk三维点云隐式曲面重建:vtkSurfaceConstructionFilter类

    千次阅读 热门讨论 2016-10-12 13:26:43
    vtk三维点云重建vtkSurfaceConstructionFilter vtkSurfaceReconstructionFilter获取假设为位于实体3D对象表面上的点列表。 计算与表面距离的带符号度量,并在常规网格上采样。 然后可以将网格轮廓化为零以提取表面...
  • VTK-3 三维点云曲面重建

    千次阅读 2018-12-02 17:43:25
    表面重建技术(三维点云曲面重建) https://blog.csdn.net/shenziheng1/article/details/54880915 多分辨率策略(模型细化的三种方法) https://blog.csdn.net/shenziheng1/article/details/54861856 VTK 点云...
  • VTK 三维 重建 切割 三维点云

    千次阅读 热门讨论 2019-09-07 21:18:28
    VTK 三维 重建 切割 三维点云 采用QT/C++/VTK QQ:1670386358 欢迎交流 加载dicom 支持CT,MR,PT,DX,CR,XA,US多种dicom浏览,支持Jpeg和Jpeg2000 Dicom图像 序列对比,多图像布局,多种测量方式,图像放缩,平移...
  • 用于三维重建方面的三维点云数据文件 ply文件格式 包含多个模型
  • 从技术角度看,SLAM、三维重建、机器人感知等领域,点云都是最简单且最普遍的表达方式:相对于图像,点云有其不可替代的优势——深度,即三维点云直接提供了三维空间的数据,而图像则需要通过透视几何来反推三维数据...
  • 常见的三维点云数据下载链接,自己整理+网上收集

    万次阅读 多人点赞 2017-05-26 12:01:08
    但是网上大部分的数据资源的数据格式都是杂乱无章而且没有清晰的数据说明,为了方便,自己整理了常用的三维点云数据,格式都是按照X坐标空格Y坐标空格Z坐标这种数据格式排列,方便数据读取和进行三维点云重建实验...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 875
精华内容 350
关键字:

三维点云重建