Windows上通过CMake编译COLMAP源码操作步骤

news2025/1/28 1:08:22

      COLMAP源码:https://github.com/colmap/colmap ,最新的稳定版本位于master分支,最新的开发版本位于dev分支,这里使用master分支进行编译,commit id为1555ff0。官方推荐使用vs2019,使用vs2022有一些已知bugs会导致crash,这里使用vs2019.

      1.安装vcpkg,依次执行如下命令:将vcpkg源码clone到C:/dev目录下

vcpkg.exe integrate install 
vcpkg.exe install ceres:x64-windows
vcpkg.exe install boost:x64-windows
vcpkg.exe install freeimage:x64-windows
vcpkg.exe install flann:x64-windows
vcpkg.exe install glew:x64-windows
vcpkg.exe install qt5:x64-windows
vcpkg.exe install metis:x64-windows

      关于vcpkg的介绍,参考:https://blog.csdn.net/fengbingchun/article/details/131145117

      2.解决编译过程中的error:
      (1).src/estimators/generalized_relative_pose.cc: fatal error C1128: 节数超过对象文件格式限制:
      在主CMakeLists.txt中,在各种option设置语句后,添加如下语句:

if(MSVC)
    add_compile_options(/bigobj)
endif()

      (2).src/estimators/pose.cc: error C2065: "qvec_data", "tvec_data":未声明的标识符
      在此文件的RefineAbsolutePose函数的前部添加如下语句:

double* qvec_data = qvec->data();
double* tvec_data = tvec->data();

      3.编写build.sh,内容如下:注:编译debug时,需要再额外从vcpkg中拷贝一些库到colmap.exe下,脚本中已添加;release不需要

#! /bin/bash

usage() {
    echo "An input parameter is required, and only one of the following parameters can be supported: debug release"
    echo "For example: $0 debug"
    exit -1
}

if [ $# != 1 ]; then
    usage
fi

echo "==== build $1 ===="

common_options=" -DCUDA_ENABLED=OFF \
    -DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"

vcpkg_path=C:/dev/vcpkg/installed/x64-windows

if [ $1 == "debug" ]; then
    if [[ ! -d "build_debug" ]]; then
        mkdir build_debug
        cd build_debug
    else
        cd build_debug
    fi

    cmake \
        -G"Visual Studio 16 2019" -A x64 \
        ${common_options} \
        -DCMAKE_BUILD_TYPE=Debug \
        -DCMAKE_CONFIGURATION_TYPES=Debug \
        ..
    cmake --build . --config debug --target colmap_exe --parallel 24

    echo "==== copy dynamic libraries ===="
    colmap_exe_path=src/exe/Debug
    cp ${vcpkg_path}/bin/lz4.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/FreeImage.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/zlib1.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/libpng16.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/tiff.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/raw.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/OpenEXR-3_1.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/Imath-3_1.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/Iex-3_1.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/lcms2.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/IlmThread-3_1.dll ${colmap_exe_path}
    cp ${vcpkg_path}/bin/Iex-3_1.dll ${colmap_exe_path}

    cp ${vcpkg_path}/debug/bin/openjp2.dll ${colmap_exe_path}
    cp ${vcpkg_path}/debug/bin/libwebpdecoder.dll ${colmap_exe_path}
elif [ $1 == "release" ]; then
    if [[ ! -d "build_release" ]]; then
        mkdir build_release
        cd build_release
    else
        cd build_release
    fi

    cmake \
        -G"Visual Studio 16 2019" -A x64 \
        ${common_options} \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_CONFIGURATION_TYPES=Release \
        ..
    cmake --build . --config release --target colmap_exe --parallel 24
else
    echo "Error: $1 is not supported"
    usage
    exit -1
fi

      执行脚本生成colmap.exe:此脚本与主CMakeLists.txt位于同一目录下
      (1).debug:./build.sh debug
      (2).release: ./build.sh release ,执行结果如下所示:

      以debug为例,执行./build.sh debug后,会在build_debug目录下生成COLMAP.sln工程,在build_debug/src/exe/Debug目录下生成colmap.exe
      COLMAP.sln工程界面如下:

      打开colmap gui:打开cmd,执行:colmap.exe gui,结果如下所示: 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Metasploit介绍

Metasploit介绍 我们经常在电影里看到有关黑客的镜头,他们通常在几个屏幕上一顿操作就能轻松“黑“进各种系统。这样的场景是不是很熟悉,是不是很羡慕? 今天我来介绍一下Metasploit Framework,简称MSF。这个工具就可以做到“Hacki…

Qt5.12.6配置Android Arm开发环境(windows)

1. 安装jdk1.8 2.安装Android Studio 并安装 SDK 与NDK SDK Tools 选择 26.0.3 SDK Platform 选择 Android SDK Platform 26 NDK选择19版本 安卓ARM环境配置成功如下: JDK1.8 , SDK 26 , NDK 19 在安装QT时要选择 ARMv7(32位CPU)与ARM64-v8a(64位CPU) 选择支持android平台…

全国各个省份市区县明细数据

全国总共有23个省、5个自治区、4个直辖市、2个特别行政区。 此数据包含省、市、区、县数据,共2886个。——更新于2023年6月10日 费了不少时间,暂时应该没有比我更全的了~~~细致到区县了 包括台湾省:台北市,新北市,桃园市,台中市,台南市,高…

计算机网络-子网划分

计算机网络-子网划分与CRC差错校验 文章目录 计算机网络-子网划分与CRC差错校验IP地址的分类A类地址B类地址C类地址D类地址和E类地址和特殊IP地址子网掩码实战💪 IP协议是 TCP/IP体系中最主要的协议之一,也是最重要的互联网协议之一。 IP协议是32位&am…

ubuntu22.04.2安装onlyoffice(不更改默认端口版)

目录 一、配置阿里源 二、postgresql数据库 (一)安装postgresql (二)创建postgresql数据库和用户 三、安装 rabbitmq 四、安装nginx-extras 五、安装ONLYOFFICE Docs (一)Add GPG key &#xff08…

【html总结--详细版】

目录 一、html 常用的标签 二、列表分为有序列表、无序列表、自定义列表 有序列表: 无序列表: 自定义列表: 三、hr 四、特殊符号 五、div和span 六、图片的属性 七、超链接 八、table表格的基本结构 table的属性 tr的属性 td的属性…

(七)CSharp-刘铁锰版-事件

一、初步了解事件 定义:单词 Event ,译为“事件” 《牛津词典》中的解释是“a thing that happens,especially something important”通顺的解释就是“能够发生的什么事情” 角色: 使对象或类具备通知能力的成员 (中译&#x…

数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

项目需求 录入进入房间的相关数据;从进入时间开始计时,计算滞留房间的时间;定时刷新数据,超过30分钟的人数,进行红色告警; 实现流程 为了完整地实现上述需求,我们可以按照以下步骤开发&#…

Log4j2漏洞复现补丁绕过

漏洞复现 这里我一共使用了两个jdk版本 8u202的情况比较特殊,其实我今天凌晨在家里用的也是8u202的版本,失败了。今天来公司也是用的8u202版本的jdk,成功了。我仔细研究了两者的不同,我发现唯一不同的就是我公司这个idea启的proie…

NLP——分布式语义 Distributional Semantics:Word Vectors;Word2Vec

文章目录 传统语义数据集的缺点分布式语义Word Vectors 词向量Count-based 基于统计的方法Document 作为上下文 —— 向量空间模型(VSM)TF-IDF 更加有效的编码方式降维Singular Value Decomposition neighbor words 作为上下文 基于深度学习的方法Word2V…

highlight clock tree 高亮时钟树的方法

当分析clock tree需要在图形界面highlight clock tree时,最朴实无华的方法就是贴报告,除此之外这里也分享一下用命令的方法。 1.Imported Path Pins 1)Highlight > Color By > Imported Path Pins 2)report_timing icc2…

【MySQL 数据库】9、存储过程

目录 一、存储过程是什么二、存储过程的基本语法三、MySQL 中的变量(1) 系统变量(2) 用户自定义变量(3) 局部变量 四、if 判断五、参数传递和返回值六、case 语句七、while 循环八、repeat 循环九、loop 循环十、游标十一、条件处理程序 一、存储过程是什么 🌱 存储…

Linux进程间通信【消息队列、信号量】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、消息队列1.1、什么是消息队列?1.2、消息队列的数据结构1.3、消…

交通物流模型 | Python实现基于张量分解的交通流量时空模式挖掘(出租车车载GPS数据、公交卡刷卡数据、POI的分布数据)

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 一般出行行程通常都由某种明确目的驱使,例如上班、购物或娱乐,出行的起始区域因其承担功能的不同,通常能够反映出用户的出行目的,于此同时,从宏观来看,区域之间的交通流量在一天内的变化规律也能够反…

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列(静态队列)1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…

【python】—— python的基本介绍并附安装教程

前言: 今天,我将给大家讲解关于python的基本知识,让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来,我们正式进入今天的文章!!! 目录 前言 (一)P…

【Linux】互斥量原理的实现

深刻理解互斥锁 文章目录 前言一、demo版的线程封装二、demo版的锁封装总结 前言 为了实现互斥锁操作 , 大多数体系结构都提供了 swap 或 exchange 指令 , 该指令的作用是把寄存器和内存单元的数据相交换, 由于只有一条指令 , 保证了原子性 , 即使是多处理器平台 , 访问内存的总…

第10讲:深入剖析 Agent 插件原理,无侵入性埋点

AbstractClassEnhancePluginDefine 核心实现 在开始之前,先简单回顾上一课时中关于 AbstractClassEnhancePluginDefine 的一个核心知识点:AbstractClassEnhancePluginDefine 是所有插件的父类,SkywalkingAgent.Transformer 会通过其 enhance…

信号完整性:反射

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化,只要互连线的阻抗不连续的点,该处就会发生反射。 信号是以电磁波的形式在走线中传播的,如果从传统的电路理论角度去看,是无…

YOLOv5使用自定义数据集实验

上一篇博文中介绍了YOLOv7训练自定义数据集,在这篇文章中,我们主要记录YOLOv5模型的实验过程,用于对比实验。 YOLOv5与YOLOv7毕竟一母同胞,因此部署起来也是极为类似。 数据集 数据集使用的与YOLOv7的实验数据集一样,…