PCL提供的ICP算法使用效果不太满意,尝试使用CGAL的super 4PCS配准方法。先配置环境编译CGAL,把过程记录下来,主要参考了这一篇。
环境是win7+vs2017。
一、准备:
- 从官网下载CGAL源码,地址https://www.cgal.org/。这里下载最新版5.1.
- 下载Eigen并解压,地址:Eigen官网。这里下载最新版3.3.8。
- 还有一些其他的依赖,之前已经安装过了,有CMake,Zlib1.2.11,Boost1.73.0。
二、添加环境变量:
添加BOOST_INCLUDEDIR : E:\boost_1_73_0。
添加BOOST_LIBRARYDIR : E:\boost_1_73_0\stage\lib。
path添加CGAL的路径:;D:\dev\CGAL-5.1\auxiliary\gmp\lib。
还添加了一个Qt : D:\Qt\Qt5.14.1。不过这个值好像并不对。
三、CMAKE编译
用CMake编译CGAL,设置源代码路径和输出路径。configure。
configure之后做了几处改动:把Ungrouped entries里的Qt5_DIR设置为D:\Qt\Qt5.14.1\5.14.1\msvc2017_64\lib\cmake\Qt5
;WITH 里勾上 WITH demos 和 WITH examples,有例子更容易验证安装是否成功;Zlib设置:
点击Generate,但是无法识别到eigen路径,于是手动编辑eigen的值到源代码解压路径E:\eigen-3.3.8。再次generate成功。
四、生成项目
打开cmake出来的sln项目,release和debug模式下分别生成ALL_BUILD,成功。
运行example项目,以 Surface mesh 为例,打开 D:\dev\CGAL-5.1\build\examples\Surface_mesh\Surface_mesh_Examples.sln,将draw_surface_mesh设为启动项目,先在debug模式下生成:
再在release模式下生成:
运行项目:
找到这个文件,把该文件夹下的所有dll文件拷贝到build出来的工程文件里的debug和release目录下,并把data/elephant.off这几个文件也拷贝到debug和release目录下,debug运行:
release运行会闪退?程序“[13292] draw_surface_mesh.exe”已退出,返回值为 1073741845 (0x40000015)。看控制台输出好像是因为缺少qt支持。
五、新建项目引用CGAL
主要参考:这篇文章,决定修改下cmake的设定。取消勾选CGAL_HEADER_ONLY,把cmake_install_prefix改成build文件夹,重新configure,generate,生成all_build。
系统环境变量的PATH添加:;D:\dev\CGAL-5.1\build\bin;E:\boost_1_73_0\stage\lib
。
新建一个win32控制台应用程序,测试CGAL环境是否可以使用。
代码:
#include "stdafx.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/self_intersections.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
namespace PMP = CGAL::Polygon_mesh_processing;
int main(int argc, char* argv[])
{
const char* filename = (argc > 1) ? argv[1] : "D:/dev/CGAL-5.1/data/pig.off";
// 样例路径在你安装的cgal的examples文件夹下面
std::ifstream input(filename);
Mesh mesh;
if (!input || !(input >> mesh) || !CGAL::is_triangle_mesh(mesh))
{
std::cerr << "Not a valid input file." << std::endl;
getchar();
return 1;
}
bool intersecting = PMP::does_self_intersect(mesh,
PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh)));
std::cout
<< (intersecting ? "There are self-intersections." : "There is no self-intersection.")
<< std::endl;
std::vector<std::pair<face_descriptor, face_descriptor> > intersected_tris;
PMP::self_intersections(mesh, std::back_inserter(intersected_tris));
std::cout << intersected_tris.size() << " pairs of triangles intersect." << std::endl;
getchar();
return 0;
}
包含目录:
库目录:
附加依赖项:
显示结果: