站群seo,企业网站报价方案下载,响应式网页源码,网站备案被注销的原因通过摸索整理了三个方法#xff1a;
一、方法1#xff1a;//不推荐#xff0c;但可以参考
1、通过pcl的compute3DCentroid()方法计算点云的中心点坐标#xff1b;
函数原型如下#xff1a;
compute3DCentroid (const pcl::PointCloudPointT cloud, Eigen…通过摸索整理了三个方法
一、方法1//不推荐但可以参考
1、通过pcl的compute3DCentroid()方法计算点云的中心点坐标
函数原型如下
compute3DCentroid (const pcl::PointCloudPointT cloud, Eigen::Vector4f centroid)
2、通过vtk的addCoordinareSystem()在指定位置放一个坐标系
函数原型如下
addCoordinareSystem(double scale, float x, float y, float z,const std::string id reference,int viewport 0); 这里的scale可以指定坐标轴的尺寸但是点云有时候比较大坐标轴也很大的时候会看起来很奇怪甚至遮挡住部分点云所以我想把这个坐标轴放在右下角就像cloudcompare软件中效果一样于是此处增加 3、通过vtk的createViewPort()新建一个窗口在右下角然后把点云放在这个小窗口里
函数原型如下
createViewPort (double xmin, double ymin, double xmax, double ymax, int viewport);此处前四个参数都表示viewer窗口中的所在位置在全图的比例最大值为1.0 4、完整代码如下
#include pcl/common/centroid.h //计算点云中心的头文件
//其它相关环境的头文件自行补充//初始化一个viewer
pcl::visualization::PCLVisualizer::Ptr viewer;
//初始化一个点云
pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ);//加载点云文件
if(pcl::io::loadPCDFile(cloud.pcd,*cloud)-1)
{//此处cloud.pcd是你的点云文件
}Eigen::Vector4f center;
pcl::compute3DCentroid(*cloud,center); //计算中心点坐标保存到centerint v1 0;
viewer-createViewPort(0.8,0.0,1.0,0.2,v1); //在viewer中新建一个窗口
viewer-addCoordinateSystem(1.0,center[0],center[1],center[2],v1,v1); //在小窗中显示坐标轴想法很丰满显示很骨感这个方法的效果并不是很好首先一点是通过createViewPort创造的小窗背景是黑色的不是透明的拖动旋转大窗口的点云时可以发现小窗部分会遮住它就像是ps里图层的概念... 二、方法2//不推荐但可以参考
在Qt中使用vtkRenderer的窗口显示点云时vtk有一个专用的函数添加坐标系
#include vtkOrientationMarkerWidget.hviewer-addOrientationMarkerWidgetAxes(ui-widget_opengl-GetInteractor());
//这里的widget_opengl是我显示点云的窗口名称
此处窗口的创建与使用可参考另一篇博客
http://t.csdn.cn/SpwoF 通过此方法可以最快速得到一个坐标系背景透明的在显示窗口的角落但是这个坐标系是可以被鼠标拖动的很容易误触有兴趣的朋友可以试一下效果
不多时便找到了更好的解决办法 三、方法3推荐
通过自定义坐标系再加入到显示点云的窗口中并且禁止鼠标改变坐标系窗口的位置就可以实现和cloudcompare几乎一致的效果了
将如下代码加入到点云显示的部分即可
QT中通过widget组件显示点云窗口的方法参考http://t.csdn.cn/SpwoF
#include vtkOrientationMarkerWidget.h
#include vtkAxesActor.hvtkAxesActor* axes vtkAxesActor::New();
axes-SetPosition(0,0,0); //坐标系的原点
axes-SetTotalLength(1,1,1); //轴长
axes-SetShaftType(1); //旋转轴的类型圆柱体、线、或者自定义
axes-SetCylinderRadius(0.02);vtkOrientationMarkerWidget* widget vtkOrientationMarkerWidget::New();
widget-SetOutlineColor(1,1,1);
widget-SetOrientationMarker(axes);
widget-SetInteractor(ui-widget_opengl-GetInteractor());//加入交互
widget-SetViewport(0.0,0.0,0.3,0.3); //设置显示位置
widget-SetEnabled(true);
widget-SetInteractive(false); //禁止拖动坐标系位置