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

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生