win10 VS2019 运行PCL tutorial ICP
ply模型下载:
https://www.cc.gatech.edu/projects/large_models/
或者自己用blender生成。
代码参考:http://www.pointclouds.org/documentation/tutorials/interactive_icp.php#interactive-icp
#include <iostream>
#include <string>#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/registration/icp.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/time.h> // TicToctypedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;bool next_iteration = false;void
print4x4Matrix(const Eigen::Matrix4d& matrix)
{printf("Rotation matrix :\n");printf(" | %6.3f %6.3f %6.3f | \n", matrix(0, 0), matrix(0, 1), matrix(0, 2));printf("R = | %6.3f %6.3f %6.3f | \n", matrix(1, 0), matrix(1, 1), matrix(1, 2));printf(" | %6.3f %6.3f %6.3f | \n", matrix(2, 0), matrix(2, 1), matrix(2, 2));printf("Translation vector :\n");printf("t = < %6.3f, %6.3f, %6.3f >\n\n", matrix(0, 3), matrix(1, 3), matrix(2, 3));
}void
keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event,void* nothing)
{if (event.getKeySym() == "space" && event.keyDown())next_iteration = true;
}int
main(int argc,char* argv[])
{// The point clouds we will be usingPointCloudT::Ptr cloud_in(new PointCloudT); // Original point cloudPointCloudT::Ptr cloud_tr(new PointCloudT); // Transformed point cloudPointCloudT::Ptr cloud_icp(new PointCloudT); // ICP output point cloud/* // Checking program argumentsif (argc < 2){printf("Usage :\n");printf("\t\t%s file.ply number_of_ICP_iterations\n", argv[0]);PCL_ERROR("Provide one ply file.\n");system("pause");return (-1);}*/int iterations = 1; // Default number of ICP iterations/*if (argc > 2){// If the user passed the number of iteration as an argumentiterations = atoi(argv[2]);if (iterations < 1){PCL_ERROR("Number of initial iterations must be >= 1\n");system("pause");return (-1);}}*/pcl::console::TicToc time;time.tic();if (pcl::io::loadPLYFile("C:/Users/Win10/Desktop/pcl_project/pcl_project/dragon.ply", *cloud_in) < 0){PCL_ERROR("Error loading cloud %s.\n", "dragon.ply");system("pause");return (-1);}std::cout << "\nLoaded file " << "dragon.ply" << " (" << cloud_in->size() << " points) in " << time.toc() << " ms\n" << std::endl;// Defining a rotation matrix and translation vectorEigen::Matrix4d transformation_matrix = Eigen::Matrix4d::Identity();cout << "a" << endl;// A rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix)double theta = M_PI / 8; // The angle of rotation in radianstransformation_matrix(0, 0) = cos(theta);transformation_matrix(0, 1) = -sin(theta);transformation_matrix(1, 0) = sin(theta);transformation_matrix(1, 1) = cos(theta);// A translation on Z axis (0.4 meters)transformation_matrix(2, 3) = 0.4;// Display in terminal the transformation matrixstd::cout << "Applying this rigid transformation to: cloud_in -> cloud_icp" << std::endl;print4x4Matrix(transformation_matrix);// Executing the transformationpcl::transformPointCloud(*cloud_in, *cloud_icp, transformation_matrix);*cloud_tr = *cloud_icp; // We backup cloud_icp into cloud_tr for later usecout << "b" << endl;// The Iterative Closest Point algorithmtime.tic();pcl::IterativeClosestPoint<PointT, PointT> icp;icp.setMaximumIterations(iterations);icp.setInputSource(cloud_icp);icp.setInputTarget(cloud_in);icp.align(*cloud_icp);icp.setMaximumIterations(1); // We set this variable to 1 for the next time we will call .align () functionstd::cout << "Applied " << iterations << " ICP iteration(s) in " << time.toc() << " ms" << std::endl;if (icp.hasConverged()){std::cout << "\nICP has converged, score is " << icp.getFitnessScore() << std::endl;std::cout << "\nICP transformation " << iterations << " : cloud_icp -> cloud_in" << std::endl;transformation_matrix = icp.getFinalTransformation().cast<double>();print4x4Matrix(transformation_matrix);}else{PCL_ERROR("\nICP has not converged.\n");system("pause");return (-1);}cout << "c" << endl;// Visualizationpcl::visualization::PCLVisualizer viewer("ICP demo");// Create two vertically separated viewportsint v1(0);int v2(1);viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);// The color we will be usingfloat bckgr_gray_level = 0.0; // Blackfloat txt_gray_lvl = 1.0 - bckgr_gray_level;// Original point cloud is whitepcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_in_color_h(cloud_in, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl,(int)255 * txt_gray_lvl);viewer.addPointCloud(cloud_in, cloud_in_color_h, "cloud_in_v1", v1);viewer.addPointCloud(cloud_in, cloud_in_color_h, "cloud_in_v2", v2);// Transformed point cloud is greenpcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_tr_color_h(cloud_tr, 20, 180, 20);viewer.addPointCloud(cloud_tr, cloud_tr_color_h, "cloud_tr_v1", v1);// ICP aligned point cloud is redpcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_icp_color_h(cloud_icp, 180, 20, 20);viewer.addPointCloud(cloud_icp, cloud_icp_color_h, "cloud_icp_v2", v2);// Adding text descriptions in each viewportviewer.addText("White: Original point cloud\nGreen: Matrix transformed point cloud", 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_1", v1);viewer.addText("White: Original point cloud\nRed: ICP aligned point cloud", 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_2", v2);cout << "d" << endl;std::stringstream ss;ss << iterations;std::string iterations_cnt = "ICP iterations = " + ss.str();viewer.addText(iterations_cnt, 10, 60, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "iterations_cnt", v2);// Set background colorviewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v1);viewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v2);// Set camera position and orientationviewer.setCameraPosition(-3.68332, 2.94092, 5.71266, 0.289847, 0.921947, -0.256907, 0);viewer.setSize(1280, 1024); // Visualiser window size// Register keyboard callback :viewer.registerKeyboardCallback(&keyboardEventOccurred, (void*)NULL);// Display the visualiserwhile (!viewer.wasStopped()){viewer.spinOnce();// The user pressed "space" :if (next_iteration){// The Iterative Closest Point algorithmtime.tic();icp.align(*cloud_icp);std::cout << "Applied 1 ICP iteration in " << time.toc() << " ms" << std::endl;if (icp.hasConverged()){printf("\033[11A"); // Go up 11 lines in terminal output.printf("\nICP has converged, score is %+.0e\n", icp.getFitnessScore());std::cout << "\nICP transformation " << ++iterations << " : cloud_icp -> cloud_in" << std::endl;transformation_matrix *= icp.getFinalTransformation().cast<double>(); // WARNING /!\ This is not accurate! For "educational" purpose only!print4x4Matrix(transformation_matrix); // Print the transformation between original pose and current posess.str("");ss << iterations;std::string iterations_cnt = "ICP iterations = " + ss.str();viewer.updateText(iterations_cnt, 10, 60, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "iterations_cnt");viewer.updatePointCloud(cloud_icp, cloud_icp_color_h, "cloud_icp_v2");}else{PCL_ERROR("\nICP has not converged.\n");system("pause");return (-1);}}next_iteration = false;}system("pause");return (0);
}
问题1:“XXX被声明为已否决”
解决:直接双击属性表的根目录Debug|X64,将C/C++—>所有选项—>SDL检查改为否。
问题2:
第三方库flann报错:
添加头文件#include <pcl/registration/icp.h>编译的时候可能会遇到如下报错:
1>...\flann\algorithms\dist.h(523): error C3861: “pop_t”: 找不到标识符
解决:
(注由于要对第三方库的头文件进行修改,建议先备份一下原头文件,其路径...\PCL 1.9.0\3rdParty\FLANN\include\flann\algorithms\dist.h)
双击该行输出直接打开dist.h头文件;
将第503行的typedef unsigned long long pop_t;移动到第480行前面;保存。
由于数据量大,比较慢。
win10 VS2019 运行PCL tutorial ICP相关推荐
- 【SLAM】SLAM环境配置 Win10+VS2019+OpenCV+PCL+g2o+Vcpkg
目录 SLAM环境配置 Win10+VS2019+OpenCV+PCL+g2o+vcpkg 软件及版本 1. Windows 10 2. Visual Studio 2019 3. OpenCV 4. ...
- Win10+vs2019配置与运行RenderMatch+用contextcapture进行重建
Win10+vs2019配置与运行RenderMatch+用contextcapture进行重建 继上一篇博客,ground image 和aerial image影像匹配结果将会被保存为match. ...
- win10+vs2019+pcl1.11.0安装教程
看pointnet论文的时候发现有点云的可视化,但里面的可视化好像是基于CAD做的,正好最近我在用c++处理一些点云数据,就想着怎么直接把点云显示出来,就找到了PCL库,与opencv类似,openc ...
- OpenMVS+Win10+VS2019+vcpkg编译及问题
Win10 + VS2019 + OpenMVS1.1.1 + Vcpkg 1 VS2019安装 2 git安装 3 vcpkg安装 3.1下载vcpkg 3.2安装vcpkg 3.3 配置环境变量 ...
- win10+vs2019+FFTW64位安装配置保姆教程
win10+vs2019+FFTW64位安装配置保姆教程 FFTW 是一个C语言的快速傅立叶变换库.(据说是世界上最快的FFT哦) vs2019下载与安装 参考链接:VS2019安装教程 FFTW下载 ...
- Win10+VS2019+OpenGL安装
Win10+VS2019+OPENGL安装 VS2019下载与安装 Visual Studio显示行号 OpenGL安装 1.创建项目,并命名(此处我命名为main),指定存储位置 2.创建好之后如图 ...
- win10上运行emwin
emwin在pc上进行模拟 文章目录 emwin在pc上进行模拟 前言 一.安装环境 二.下载代码 1.文件大概 2.改变demo 总结 前言 提示:这里可以添加本文要记录的大概内容: 简而言之,em ...
- win10+vs2019配置lite.ai.toolkit预编译库
目录 一.配置OpenCV 2. 解压安装包,双击安装包,指定解压缩目录 3.属性页会在后面一起配置 二.配置Onnxruntime 三.配置TNN 四.在VS2019下编译MNN 五.配置NCNN环 ...
- 【opencv安装和配置完整版教程】(win10+vs2019+opencv4.4.0+opencv_contrib-4.4.0+永久配置)
[opencv安装和配置](win10+vs2019+opencv4.4.0+opencv_contrib-4.4.0+永久配置) 下载vs2019 opencv4.4.0.opencv_contri ...
最新文章
- 力扣(LeetCode)刷题,简单题(第10期)
- Spring源码学习笔记1
- Spring 3.0参考之SpEL
- 理解并使用ASP.NET的高级配置
- JSP中的forward指令
- 关于本机IP的获取(附带Demo)
- 使用可变对象作为Java Map的key,会带来潜在风险的一个例子
- windows 9X, 2000, xp所有版本注册表设置(1)
- C#基础之--线程、任务和同步:一、异步委托
- 012的悲剧终于预言了
- 如何远程配置DHCP服务器
- python脚本调度程序_python任务调度实例分析
- C#顺时针逆时针旋转图片
- 12306 抢票软件已被限制
- 计算机组成与原理名词解释,计算机组成原理名词解释与简答
- SimpleApp例程中两种绑定机制程序流程
- 力扣:121. 买卖股票的最佳时机 题解
- 最新交易猫源码+独立后台管理
- jvisualvm 连接 docker 监控springboot jvm
- vue3学习之旅--邂逅vue3-了解认识Vue3(二)