PCL可视化相关的教程,添加直线,立方体,点云等等

PCL1.72

VTK6.20

控制台程序

加入.props属性表文件

1、Cloud_Viewer

Cloud_Viewer.cpp代码:

 

 
  1. #include <vtkAutoInit.h>

  2. VTK_MODULE_INIT(vtkRenderingOpenGL);

  3. VTK_MODULE_INIT(vtkInteractionStyle);

  4. VTK_MODULE_INIT(vtkRenderingFreeType);

  5.  
  6. #include <pcl/visualization/cloud_viewer.h>

  7. #include <iostream>

  8. #include <pcl/io/io.h>

  9. #include <pcl/io/pcd_io.h>

  10.  
  11. int user_data;

  12. void

  13. viewerOneOff(pcl::visualization::PCLVisualizer& viewer)

  14. {

  15. viewer.setBackgroundColor(1.0f, 0.5f, 1.0f);

  16. pcl::PointXYZ o;

  17. o.x = 1.0;

  18. o.y = 0;

  19. o.z = 0;

  20. viewer.addSphere(o, 0.25, "Sphere", 0);

  21. std::cout << "I only run once" << std::endl;

  22. }

  23.  
  24. void

  25. viewerPsycho(pcl::visualization::PCLVisualizer& viewer)

  26. {

  27. static unsigned count = 0;

  28. std::stringstream ss;

  29. ss << "Once per viewer loop: " << count++;

  30. viewer.removeShape("text", 0);

  31. viewer.addText(ss.str(), 200, 300, "text", 0);//this is to set the coordination of text "Once per viewer loop:"

  32. //FIXME : possible race condition here

  33. user_data++;

  34. }

  35.  
  36. int

  37. main()

  38. {

  39. pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);

  40. pcl::io::loadPCDFile("maize.pcd", *cloud);

  41. pcl::visualization::CloudViewer viewer("Cloud Viewer");

  42. //showCloud 函数是同步的,在此处等待直到渲染显示为止

  43. viewer.showCloud(cloud);

  44. //该注册函数在可视化时只调用一次

  45. viewer.runOnVisualizationThreadOnce(viewerOneOff);

  46. //该注册函数在渲染输出是每次都调用

  47. viewer.runOnVisualizationThread(viewerPsycho);

  48. while (!viewer.wasStopped())

  49. {

  50. //在此处可以添加其他处理

  51. user_data++;

  52. }

  53. return 0;

  54. }

编译,运行:

 

 

2、控制台程序:pcl_visualizer_demo

注意:

1)报错 Error C4996"fopen" 在属性——预处理器——预处理器定义中,添加_CRT_SECURE_NO_WARNINGS命令,重新编译即可通过。

2)头文件前面加入

 
  1. #include <vtkAutoInit.h>

  2. VTK_MODULE_INIT(vtkRenderingOpenGL);

  3. VTK_MODULE_INIT(vtkInteractionStyle);

  4. VTK_MODULE_INIT(vtkRenderingFreeType);

3)viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");

这句是产生点云数据的代码,注释掉后,界面中就没有点云可显示。

4)viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");

这句是为点云添加法线,这行代码放在绘制点云的代码后面,即可实现对点云法线的显示。
一旦用户计算得到法线,只需要一行程序在视窗中就可以显示这些法线,该显示法线成员方法的参数有法线显示的个数(这里,每 10 个点显示一个)及每个法线的长度 (在这个例子中是 0.05,当然用户可以自行调整为这些参数)。

5)//在其他位置添加基于模型参数的平面及圆锥体
pcl::ModelCoefficients coeffs;
coeffs.values.push_back (0.0);
coeffs.values.push_back (0.0);
coeffs.values.push_back (1.0);
coeffs.values.push_back (0.0);
viewer->addPlane (coeffs, "plane");

上面几行代码将添加绘制平面 。 在本例中我们用标准的平面方程 ( ax + by + cz+d =0 )来定义平面,这个平面以原点为中心,方向沿 Z 方向,许多绘制形状的函数都采用这种定义系数的方法来定义形状。

6)coeffs.values.clear ();

coeffs.values.push_back (0.3);
coeffs.values.push_back (0.3);
coeffs.values.push_back (0.0);
coeffs.values.push_back (0.0);
coeffs.values.push_back (1.0);
coeffs.values.push_back (0.0);
coeffs.values.push_back (5.0);
viewer->addCone (coeffs, "cone");

利用模型系数指定锥形的参数。

7)int v1(0);
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->setBackgroundColor (0, 0, 0, v1);
viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);

第一句是Vieweport的默认位置,第二句是设置视口的代码,第三句设置背景色,第四句添加文字。

 

///

pcl_visualizer_demo.cpp代码:

 

 
  1. #include <vtkAutoInit.h>

  2. VTK_MODULE_INIT(vtkRenderingOpenGL);

  3. VTK_MODULE_INIT(vtkInteractionStyle);

  4. VTK_MODULE_INIT(vtkRenderingFreeType);

  5.  
  6. /* \author Geoffrey Biggs */

  7.  
  8. #include <iostream>

  9. #include <boost/thread/thread.hpp>

  10. #include <pcl/common/common_headers.h>

  11. #include <pcl/common/common_headers.h>

  12. #include <pcl/features/normal_3d.h>

  13. #include <pcl/io/pcd_io.h>

  14. #include <pcl/visualization/pcl_visualizer.h>

  15. #include <pcl/console/parse.h>

  16. // 帮助

  17. void

  18. printUsage (const char* progName)

  19. {

  20. std::cout << "\n\nUsage: "<<progName<<" [options]\n\n"

  21. << "Options:\n"

  22. << "-------------------------------------------\n"

  23. << "-h this help\n"

  24. << "-s Simple visualisation example\n"

  25. << "-r RGB colour visualisation example\n"

  26. << "-c Custom colour visualisation example\n"

  27. << "-n Normals visualisation example\n"

  28. << "-a Shapes visualisation example\n"

  29. << "-v Viewports example\n"

  30. << "-i Interaction Customization example\n"

  31. << "\n\n";

  32. }

  33.  
  34. //Simple visualisation example

  35. boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)

  36. {

  37. //创建3D窗口并添加点云

  38. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  39. viewer->setBackgroundColor (0, 0, 0);

  40. viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");

  41. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");

  42. viewer->addCoordinateSystem (1.0);

  43. viewer->initCameraParameters ();

  44. return (viewer);

  45. }

  46.  
  47. //RGB colour visualisation example

  48. boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)

  49. {

  50. //创建3D窗口并添加点云

  51. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  52. viewer->setBackgroundColor (0, 0, 0);

  53. pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);

  54. viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");

  55. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");

  56. viewer->addCoordinateSystem (1.0);

  57. viewer->initCameraParameters ();

  58. return (viewer);

  59. }

  60.  
  61. //Custom colour visualisation example

  62. boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)

  63. {

  64. //创建3D窗口并添加点云

  65. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  66. viewer->setBackgroundColor (0, 0, 0);

  67. pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);

  68. viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");

  69. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");

  70. viewer->addCoordinateSystem (1.0);

  71. viewer->initCameraParameters ();

  72. return (viewer);

  73. }

  74.  
  75. //Normals visualisation example

  76. boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis (

  77. pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)

  78. {

  79. //创建3D窗口并添加点云其包括法线

  80. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  81. viewer->setBackgroundColor (0, 0, 0);

  82. pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);

  83. viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");

  84. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");

  85. viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");

  86. viewer->addCoordinateSystem (1.0);

  87. viewer->initCameraParameters ();

  88. return (viewer);

  89. }

  90.  
  91. //Shapes visualisation example

  92. boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)

  93. {

  94. //创建3D窗口并添加点云

  95. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  96. viewer->setBackgroundColor (0, 0, 0);

  97. pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);

  98. viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");

  99. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");

  100. viewer->addCoordinateSystem (1.0);

  101. viewer->initCameraParameters ();

  102. //在点云上添加直线和球体模型

  103. viewer->addLine<pcl::PointXYZRGB> (cloud->points[0],

  104. cloud->points[cloud->size() - 1], "line");

  105. viewer->addSphere (cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");

  106. //在其他位置添加基于模型参数的平面及圆锥体

  107. pcl::ModelCoefficients coeffs;

  108. coeffs.values.push_back (0.0);

  109. coeffs.values.push_back (0.0);

  110. coeffs.values.push_back (1.0);

  111. coeffs.values.push_back (0.0);

  112. viewer->addPlane (coeffs, "plane");

  113. coeffs.values.clear ();

  114. coeffs.values.push_back (0.3);

  115. coeffs.values.push_back (0.3);

  116. coeffs.values.push_back (0.0);

  117. coeffs.values.push_back (0.0);

  118. coeffs.values.push_back (1.0);

  119. coeffs.values.push_back (0.0);

  120. coeffs.values.push_back (5.0);

  121. viewer->addCone (coeffs, "cone");

  122.  
  123. return (viewer);

  124. }

  125.  
  126. //Viewports example

  127. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis (

  128. pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)

  129. {

  130. // 创建3D窗口并添加显示点云其包括法线

  131. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  132. viewer->initCameraParameters ();

  133. int v1(0);

  134. viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);

  135. viewer->setBackgroundColor (0, 0, 0, v1);

  136. viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);

  137. pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);

  138. viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);

  139. int v2(0);

  140. viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);

  141. viewer->setBackgroundColor (0.3, 0.3, 0.3, v2);

  142. viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);

  143. pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);

  144. viewer->addPointCloud<pcl::PointXYZRGB> (cloud, single_color, "sample cloud2", v2);

  145. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");

  146. viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");

  147. viewer->addCoordinateSystem (1.0);

  148.  
  149. viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);

  150. viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);

  151.  
  152. return (viewer);

  153. }

  154.  
  155.  
  156. unsigned int text_id = 0;

  157. void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event,

  158. void* viewer_void)

  159. {

  160. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);

  161. if (event.getKeySym () == "r" && event.keyDown ())

  162. {

  163. std::cout << "r was pressed => removing all text" << std::endl;

  164.  
  165. char str[512];

  166. for (unsigned int i = 0; i < text_id; ++i)

  167. {

  168. sprintf (str, "text#%03d", i);

  169. viewer->removeShape (str);

  170. }

  171. text_id = 0;

  172. }

  173. }

  174.  
  175. void mouseEventOccurred (const pcl::visualization::MouseEvent &event,

  176. void* viewer_void)

  177. {

  178. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);

  179. if (event.getButton () == pcl::visualization::MouseEvent::LeftButton &&

  180. event.getType () == pcl::visualization::MouseEvent::MouseButtonRelease)

  181. {

  182. std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;

  183.  
  184. char str[512];

  185. sprintf (str, "text#%03d", text_id ++);

  186. viewer->addText ("clicked here", event.getX (), event.getY (), str);

  187. }

  188. }

  189.  
  190. //Interaction Customization example

  191. boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis ()

  192. {

  193. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

  194. viewer->setBackgroundColor (0, 0, 0);

  195. viewer->addCoordinateSystem (1.0);

  196.  
  197. viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)&viewer);

  198. viewer->registerMouseCallback (mouseEventOccurred, (void*)&viewer);

  199.  
  200. return (viewer);

  201. }

  202. // -----Main-----

  203. int

  204. main (int argc, char** argv)

  205. {

  206. // 解析命令行参数

  207. if (pcl::console::find_argument (argc, argv, "-h") >= 0)

  208. {

  209. printUsage (argv[0]);

  210. return 0;

  211. }

  212. bool simple(false), rgb(false), custom_c(false), normals(false),

  213. shapes(false), viewports(false), interaction_customization(false);

  214. if (pcl::console::find_argument (argc, argv, "-s") >= 0)

  215. {

  216. simple = true;

  217. std::cout << "Simple visualisation example\n";

  218. }

  219. else if (pcl::console::find_argument (argc, argv, "-c") >= 0)

  220. {

  221. custom_c = true;

  222. std::cout << "Custom colour visualisation example\n";

  223. }

  224. else if (pcl::console::find_argument (argc, argv, "-r") >= 0)

  225. {

  226. rgb = true;

  227. std::cout << "RGB colour visualisation example\n";

  228. }

  229. else if (pcl::console::find_argument (argc, argv, "-n") >= 0)

  230. {

  231. normals = true;

  232. std::cout << "Normals visualisation example\n";

  233. }

  234. else if (pcl::console::find_argument (argc, argv, "-a") >= 0)

  235. {

  236. shapes = true;

  237. std::cout << "Shapes visualisation example\n";

  238. }

  239. else if (pcl::console::find_argument (argc, argv, "-v") >= 0)

  240. {

  241. viewports = true;

  242. std::cout << "Viewports example\n";

  243. }

  244. else if (pcl::console::find_argument (argc, argv, "-i") >= 0)

  245. {

  246. interaction_customization = true;

  247. std::cout << "Interaction Customization example\n";

  248. }

  249. else

  250. {

  251. printUsage (argv[0]);

  252. return 0;

  253. }

  254. // 自行创建一随机点云

  255. pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);

  256. pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);

  257. std::cout << "Genarating example point clouds.\n\n";

  258. // 以椭圆为边线沿z轴拉伸获取其点云,并赋予红绿蓝渐变色。

  259. uint8_t r(255), g(15), b(15);

  260. for (float z(-1.0); z <= 1.0; z += 0.05)

  261. {

  262. for (float angle(0.0); angle <= 360.0; angle += 5.0)

  263. {

  264. pcl::PointXYZ basic_point;

  265. basic_point.x = 0.5 * cosf (pcl::deg2rad(angle));

  266. basic_point.y = sinf (pcl::deg2rad(angle));

  267. basic_point.z = z;

  268. basic_cloud_ptr->points.push_back(basic_point);

  269.  
  270. pcl::PointXYZRGB point;

  271. point.x = basic_point.x;

  272. point.y = basic_point.y;

  273. point.z = basic_point.z;

  274. uint32_t rgb = (static_cast<uint32_t>(r) << 16 |

  275. static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));

  276. point.rgb = *reinterpret_cast<float*>(&rgb);

  277. point_cloud_ptr->points.push_back (point);

  278. }

  279. if (z < 0.0)

  280. {

  281. r -= 12;

  282. g += 12;

  283. }

  284. else

  285. {

  286. g -= 12;

  287. b += 12;

  288. }

  289. }

  290. basic_cloud_ptr->width = (int) basic_cloud_ptr->points.size ();

  291. basic_cloud_ptr->height = 1;

  292. point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();

  293. point_cloud_ptr->height = 1;

  294. // 0.05为搜索半径获取点云法线

  295. pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;

  296. ne.setInputCloud (point_cloud_ptr);

  297. pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB> ());

  298. ne.setSearchMethod (tree);

  299. pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);

  300. ne.setRadiusSearch (0.05);

  301. ne.compute (*cloud_normals1);

  302. // 0.1为搜索半径获取点云法线

  303. pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);

  304. ne.setRadiusSearch (0.1);

  305. ne.compute (*cloud_normals2);

  306.  
  307. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;

  308. if (simple)

  309. {

  310. viewer = simpleVis(basic_cloud_ptr);

  311. }

  312. else if (rgb)

  313. {

  314. viewer = rgbVis(point_cloud_ptr);

  315. }

  316. else if (custom_c)

  317. {

  318. viewer = customColourVis(basic_cloud_ptr);

  319. }

  320. else if (normals)

  321. {

  322. viewer = normalsVis(point_cloud_ptr, cloud_normals2);

  323. }

  324. else if (shapes)

  325. {

  326. viewer = shapesVis(point_cloud_ptr);

  327. }

  328. else if (viewports)

  329. {

  330. viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);

  331. }

  332. else if (interaction_customization)

  333. {

  334. viewer = interactionCustomizationVis();

  335. }

  336. // 主循环

  337. while (!viewer->wasStopped ())

  338. {

  339. viewer->spinOnce (100);

  340. boost::this_thread::sleep (boost::posix_time::microseconds (100000));

  341. }

  342. }


调试运行:

 

F5或者Ctrl+F5是没有作用的,需要在控制台中运行

1)Win+r,确定,进入控制台

2)输入:cd /d D:\PCLWorkspace\7\pcl_visualizer_demo\Debug

3)输入:pcl_visualizer_demo.exe -s

可以观察第一个例程,其他的例子操作类似。

 

运行结果:

simple:

RGB:

Custom:

Normals:

Shape:

Viewerports:

Interaction:

 

 

 

 

3、PCL可视化窗口的一些常用快捷键操作,有的在VTK界面中也是可以的:

r键: 重现视角。如果读入文件没有在主窗口显示,不妨按下键盘的r键一试。
j键:截图功能。
g键:显示/隐藏 坐标轴。 
鼠标:左键,使图像绕自身旋转; 滚轮, 按住滚轮不松,可移动图像,滚动滚轮,可放大/缩小 图像; 右键,“原地” 放大/缩小。
-/+:-(减号)可缩小点; +(加号),可放大点。


4、两点间划线例程,其实就是显示两点直线:

       在pcl中, 有一类可以画两点之间线段的函数,绘制点之间连线的方法十分有用,例如,显示两组点云之间的对应点关系时,可方便用户直观的观看点云之间的对应关系。它是可视化函数pcl::visualizeton的一员:

 

 
  1. #include <iostream>

  2. #include <pcl/visualization/pcl_visualizer.h>

  3. #include <pcl/point_types.h>

  4. #include <boost/thread/thread.hpp>

  5. using namespace std;

  6. typedef pcl::PointCloud<pcl::PointXYZ> pointcloud;

  7. int main(int argc, char *argv[])

  8. {

  9. pointcloud::Ptr cloud (new pointcloud);

  10. pcl::PointXYZ a, b, z;

  11. a.x = 0;

  12. a.y = 0;

  13. a.z = 0;

  14. b.x = 5;

  15. b.y = 8;

  16. b.z = 10;

  17. z.x = 4;

  18. z.y = 3;

  19. z.z = 20;

  20.  
  21. boost::shared_ptr<pcl::visualization::PCLVisualizer> view (new pcl::visualization::PCLVisualizer ("line Viewer"));

  22. view->setBackgroundColor(r,g,b); //背景色

  23. view->addLine<pcl::PointXYZ>(a,b,"line");

  24. view->addLine<pcl::PointXYZ> (a,z,255,0,0,"line1"); //红色线段,线的名字叫做"line1"

  25. view->addArrow<pcl::PointXYZ> (b,z,255,0,0,"arrow"); //带箭头

  26. while (!view->wasStopped ())

  27. {

  28. view->spinOnce(100);

  29. boost::this_thread::sleep (boost::posix_time::microseconds (100000));

  30.  
  31. }

  32.  
  33. return 0;

  34. }


      上面程序主要是画了两条线段,a-b,名字叫做“line”; a-z. 名字叫做"line1"其中a-z为红色,在addLine<PointT>函数中,其原型为

 

addLine(p1,p2,r,g,b, "viewport");

addArrow(b,z,r,g,b,"id name"), 

       主要是画出从b指向z的带箭头的线段,其颜色由用户指定,也可默认。

5、PCL可视化类显示直方图,

1)以FPFH为例,可以这样做,注意这边的用histogram_visualizer.h里的函数:

 

 
  1. #include <pcl/visualization/histogram_visualizer.h> //直方图的可视化

  2. #include <boost/thread/thread.hpp>

  3. #include <pcl/visualization/pcl_plotter.h>

  4. int main (int argc, char **argv)

  5. {

  6. ....

  7. 直方图计算

  8. ....

  9.  
  10. pcl::visualization::PCLHistogramVisualizer view;

  11. view.setBackgroundColor(255,0,0);

  12. view.addFeatureHistogram<pcl::FPFHSignature33> (*fpfhs,"fpfh",1000);//对下标为1000的元素可视化

  13. //view.spinOnce(10000); //循环的次数

  14. view.spin(); //无限循环

  15. return 0;

  16. }

2)也可以用pcl_plotter.h中的plotter函数来画直方图,需要在添加头文件#include <pcl/visualization/pcl_plotter.h>:

 

 

 
  1. #include <pcl/visualization/pcl_plotter.h>

  2.  
  3. ……

  4.  
  5. pcl::visualization::PCLPlotter plotter;

  6. // We need to set the size of the descriptor beforehand.

  7. plotter.addFeatureHistogram(*fpfhs, 300); //设置的很坐标长度,该值越大,则显示的直方图越细致

  8. plotter.plot();

  9. 转载的文章链接:

  10. https://blog.csdn.net/fandq1223/article/details/53186244

  11. 如您需要更多的信息,欢迎一起咨询,一起学习

    温馨提示:微信扫码关注我们:跟着数理化走天下

    获得更多的信息哦,一起交流,一起成长哦:微信号:跟着数理化走天下,纯属个人的交流,无盈利目的

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值