Graph Cut Ransac代码编译过程

2024-06-07 23:18

本文主要是介绍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} sudoaptgetinstalllibcpprestdev
但是运行了这个命令之后,依然会报该错误,后来发现这里只是安装了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代码编译过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040577

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN