本文主要是介绍Graph Cut Ransac代码编译过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、 论文简介
Graph Cut Ransac来自于CVPR2018,本文提出了一种新的鲁棒估计算法,叫做图割RANSAC,简称GC-RANSAC。当找到当前最好模型时,该算法在局部优化中使用图割算法来区分局内点和局外点。本文提出的局部优化算法理论简洁、易于实现,运行效率高。
原文链接:https://www.researchgate.net/publication/317356965_Graph-Cut_RANSAC/download
github源码:https://github.com/danini/graph-cut-ransac
论文讲解:http://www.jintiankansha.me/t/qrfUea99AY
二、 代码编译
对于这份代码的编译耗费了我很多时间,我觉得这份代码是在windows下用VS2015或更高版本编写的,很多头文件在ubuntu16.04中根本不存在,因此编译花了几天时间。
1、拿到代码立即编译,会出现这个错误
GCoptimization.cpp:11:17 fatal error: ppl.h: 没有那个文件或目录
解决方案:对于这个错误,github上有人提问:https://github.com/danini/graph-cut-ransac/issues/9, 作者给出了解决方案: s u d o a p t − g e t i n s t a l l l i b c p p r e s t − d e v \color{blue}{sudo apt-get install libcpprest-dev} sudoapt−getinstalllibcpprest−dev
但是运行了这个命令之后,依然会报该错误,后来发现这里只是安装了pplx而非ppl,因此需要引入pplx.h的头文件,我的机器上pplx.h的的路径为:usr/include/pplx/pplx.h, 那么我们在GCoptimization.cpp中将#include <ppl.h> 改为 #include “usr/include/pplx/pplx.h” 即可。
2、改完这里,再次make,出现了如下的错误
GCoptimization.h:140:28:error: ‘DBL_MAX’ was not declared in this scope
解决方案: 这个错误相对容易解决,在GCoptimization.h中加入 #include <float.h>即可。
3、接下来继续make,出现了如下的错误
GCRANSAC.h:3:39: fatal error: opencv2\highgui\highgui.hpp:没有那个文件或目录
解决方案:这是因为linux的路径跟windows的区别,这里将斜杠改一下即可,在GCRANSAC.h中包含头文件的部分将这个路径改为:opencv2/highgui/highgui.hpp即可。
4、接下来继续make,出现了如下的错误
main.cpp:23: fatal error: direct.h :没有那个文件或目录
解决方案: 在main.cpp中直接注释#include <direct.h>即可。
5、接下来继续make,出现了如下的错误
prosac_sampler.h:170:5:error: ‘cout’ is not a member of ‘std’
解决方案:在prosac_sampler.h中加入cout的头文件<iostream>即可。
6、接下来继续make,出现了如下的错误
GCRANSAC.h:77:7:error: ‘unique_ptr’ in namespace ‘std’ does not name a template type std::unique_ptr<theia::ProsacSampler<cv::Mat >> prosac_sampler;
解决方案:查找unique_ptr,发现位于:/usr/include/c++/5/bits/unique_ptr.h, 因此在GCRANSAC.h加入头文件:#include “/usr/include/c++/5/bits/unique_ptr.h”,
7、接下来继续make,出现了如下的错误
estimator.h:120:4:error: ‘vector’ was not declared in this scaope
解决方案:在estimator.h中加入头文件即可#include < vector >即可。
8、接下来继续make,出现了如下的错误
estimator.h:122:4:error: ‘concurrency’ has not been declared concurrrency::parallel_for(0,(int)data.size(),[&](int i)
解决方案:没有详细处理,把这里的并行改为了串行。
9、接下来继续make,出现了如下的错误
main.cpp:78:25:error: ‘_makedir’ was not declared in this scope
解决方案:参见博客:https://www.cnblogs.com/matthew-2013/p/4675366.html
10、接下来继续make,出现了如下的错误
源码为:
解决方案:经查发现上述for循环的写法需要c++14支持,因此需要改动两处:
1)根目录CMakeLists.txt中将 set(CMAKE_CXX_STANDARD 17) 改为 set(CMAKE_CXX_STANDARD 14)
2)升级系统gcc/g++编译器到7.4.0, 安装命令如下:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-7 g++-7# 安装完成之后,再将其与最新版本之间建立链接。每次输入gcc,g++时
# 自动使用最新版本。其默认安装位置 /usr/bin/
# 方法一:强制建立新链接。
sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc -f
sudo ln -s /usr/bin/g++-7 /usr/bin/g++ -f
11、 最后再make,程序编译通过,运行样例。生成的程序在主目录的bin文件夹下,不过需要首先在主目录下创建results文件夹。运行结果为:
results:
这篇关于Graph Cut Ransac代码编译过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!