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相关推荐

  1. 【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. ...

  2. Win10+vs2019配置与运行RenderMatch+用contextcapture进行重建

    Win10+vs2019配置与运行RenderMatch+用contextcapture进行重建 继上一篇博客,ground image 和aerial image影像匹配结果将会被保存为match. ...

  3. win10+vs2019+pcl1.11.0安装教程

    看pointnet论文的时候发现有点云的可视化,但里面的可视化好像是基于CAD做的,正好最近我在用c++处理一些点云数据,就想着怎么直接把点云显示出来,就找到了PCL库,与opencv类似,openc ...

  4. OpenMVS+Win10+VS2019+vcpkg编译及问题

    Win10 + VS2019 + OpenMVS1.1.1 + Vcpkg 1 VS2019安装 2 git安装 3 vcpkg安装 3.1下载vcpkg 3.2安装vcpkg 3.3 配置环境变量 ...

  5. win10+vs2019+FFTW64位安装配置保姆教程

    win10+vs2019+FFTW64位安装配置保姆教程 FFTW 是一个C语言的快速傅立叶变换库.(据说是世界上最快的FFT哦) vs2019下载与安装 参考链接:VS2019安装教程 FFTW下载 ...

  6. Win10+VS2019+OpenGL安装

    Win10+VS2019+OPENGL安装 VS2019下载与安装 Visual Studio显示行号 OpenGL安装 1.创建项目,并命名(此处我命名为main),指定存储位置 2.创建好之后如图 ...

  7. win10上运行emwin

    emwin在pc上进行模拟 文章目录 emwin在pc上进行模拟 前言 一.安装环境 二.下载代码 1.文件大概 2.改变demo 总结 前言 提示:这里可以添加本文要记录的大概内容: 简而言之,em ...

  8. win10+vs2019配置lite.ai.toolkit预编译库

    目录 一.配置OpenCV 2. 解压安装包,双击安装包,指定解压缩目录 3.属性页会在后面一起配置 二.配置Onnxruntime 三.配置TNN 四.在VS2019下编译MNN 五.配置NCNN环 ...

  9. 【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 ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第10期)
  2. Spring源码学习笔记1
  3. Spring 3.0参考之SpEL
  4. 理解并使用ASP.NET的高级配置
  5. JSP中的forward指令
  6. 关于本机IP的获取(附带Demo)
  7. 使用可变对象作为Java Map的key,会带来潜在风险的一个例子
  8. windows 9X, 2000, xp所有版本注册表设置(1)
  9. C#基础之--线程、任务和同步:一、异步委托
  10. 012的悲剧终于预言了
  11. 如何远程配置DHCP服务器
  12. python脚本调度程序_python任务调度实例分析
  13. C#顺时针逆时针旋转图片
  14. 12306 抢票软件已被限制
  15. 计算机组成与原理名词解释,计算机组成原理名词解释与简答
  16. SimpleApp例程中两种绑定机制程序流程
  17. 力扣:121. 买卖股票的最佳时机 题解
  18. 最新交易猫源码+独立后台管理
  19. jvisualvm 连接 docker 监控springboot jvm
  20. vue3学习之旅--邂逅vue3-了解认识Vue3(二)

热门文章

  1. 尝试Houdini的Maya插件
  2. 【3DMax】细节2【修改物体坐标中心】
  3. 偷偷学习Java,然后惊艳所有人 JavaSE总结 - thread多线程
  4. echarts使用之label自定义
  5. 远程桌面 锁定_如何远程锁定Windows 10 PC
  6. 华为服务器改存储硬盘,华为RH2288H V3服务器磁盘2208阵列卡做RAID10教程
  7. ERP用户自定义打印
  8. web浏览器与IE的关系,如何设置web浏览器工作在IE9模式下?
  9. LeetCode:206(Python)—— 反转链表(简单)
  10. 组件表格-jqGrid