Win10+vs2019配置与运行RenderMatch(踩坑记录)

news2024/10/2 14:35:22

Win10+vs2019配置与运行RenderMatch

RenderMatch旨在解决aerial images 和ground images 匹配问题,其思路可参考原论文 “Leveraging Photogrammetric Mesh Models for Aerial-Ground Feature Point Matching Toward Integrated 3D Reconstruction”

1.源码下载

Github: https://github.com/saedrna/RenderMatch

2.环境配置与编译

按照作者提供的readme文档,首先创建虚拟环境
在这里插入图片描述
依次在cmd命令行执行上面红色框中的命令,创建虚拟环境
其中,build.bat文件里可以修改使用的VS版本,可根据实际进行修改
在这里插入图片描述

3 .代码生成

1.用vs2019打开build文件夹中的RenderMatch.sln, 使用 release x64模式
在这里插入图片描述
对每个项目都依次右键进行生成,也可以直接对CMakePredefinedTargets里的INSTALL右键一次性生成所有项目。
问题1: 生成时会出现几百个报错,都是“未定义的标识符”“未声明的变量”之类的等等问题
原因是编码的问题,双击错误提示定位到错误所在的源文件,在代码区域的右下角将LF类型编码修改为CRLF。将所有报错提示所在的源文件都照此修改。
在这里插入图片描述

问题2:
错误提示fatal error LNK1104: 无法打开文件"tbb12.lib”
解决方法:给项目添加库文件路径,配置属性–>链接器–>常规–>附加目录 。在里面填上库文件所在的路径即可。
再次生成,无报错。

4.运行demo案例

首先在github上下载数据集,解压后按照给的作者给的routine执行
在这里插入图片描述
可以选择在cmd使用命令执行,也可以在vs里右键项目属性-调试-命令 里输入参数,并设置该项目为启动项,然后运行。
在这里插入图片描述

问题3: 出现了下图问题
在这里插入图片描述
找了很久原因,甚至重新配了环境,最后发现是因为这个dll与vcpkg里的dll冲突了,所有右键项目属性-vcpkg,将使用vcpkg改成否
在这里插入图片描述
**问题4:**执行 TileImage -i Aerial.xml -o ./AerialTiled 时,要将语句中的Aerial.xml修改为所下数据集中的aerial.xml对应的路径和名字,我这里就是 SWJTU-LIB-UAV.xml
同时,还需要打开该xml文件,将里面的ImagePath全部修改成自己的图片存放路径,否则会报错无法找到图片。
在这里插入图片描述
运行成功,继续运行下一个语句:FeatureExtract -i ./AerialTiled/Aerial.json 注意这里的json文件的名字也要改成自己生成的json文件的名字,运行完就生成了很多sift文件
问题5 按照他的demo运行最后一个语句结果发现什么都没有。。。
在这里插入图片描述
查看代码发现这里是错误的,-g 参数后面应该对应的是ground的json文件,因此,需要对ground image也执行一遍TileImage 和FeatureExtract
然后修改RenderMeshMatch命令 为:

 -a G:\study\Dataset\SWJTU-LIB\AerialTiled\SWJTU-LIB-UAV.json -g G:\study\Dataset\SWJTU-LIB\AerialTiled\SWJTU-LIB-TER.json -m G:\study\Dataset\SWJTU-LIB\model\Data\root.osgb -c G:\study\RenderMatch-master\config.json 

路径需要根据自己的路径进行修改。
问题6 再次运行,还是报错,发现是osgb模型加载失败
错误信息:Could not find plugin to read objects from file
原因是缺一些库,去conda环境下把库都拷进来
问题7 不报错了,但是还是什么结果都没有。。。最后发现是还有个坐标没有输入。。。在数据集中model文件夹里拷贝metadata.xml里的坐标,加到命令中,如下

 -a G:\study\Dataset\SWJTU-LIB\AerialTiled\SWJTU-LIB-UAV.json -g G:\study\Dataset\SWJTU-LIB\AerialTiled\SWJTU-LIB-TER.json -m G:\study\Dataset\SWJTU-LIB\model\Data\root.osgb -c G:\study\RenderMatch-master\config.json -t 2967,5742,0 

可以运行了,最终会生成一个match.bin文件,里面是匹配结果,这个bin文件是一个二进制文件
发现在输入的命令参数,加上 -r G:\study\Dataset\SWJTU-LIB\AerialTiled\SWJTU-LIB-TER_match.bin
那么每次运行时,就不会在进行匹配,而是直接加载匹配结果,像酱紫
在这里插入图片描述
match_results对应的结构体是
在这里插入图片描述
可以看出分别是点的三维坐标,在renderImg、aerialImg、GroundImg中对应的影像序号和像点坐标,可以选择自己想要的方式输出匹配结果。

5. 生成匹配结果图

这里我想将一张aerial image 和ground image 影像的匹配结果对应起来,在一张影像中显示出来
于是添加opencv的画线代码

cv::Mat aerial_image = cv::imread(block_aerial.photos[60].path);
        cv::Mat ground_image = cv::imread(block_ground.photos[25].path);

        int w_a = aerial_image.cols;
        int h_a = aerial_image.rows;
        int w_g = ground_image.cols;
        int h_g = ground_image.rows;

        int w_new = std::max(w_a, w_g); // the width and height of the combined image
        int h_new = h_a + h_g;

        cv::Mat combined_img = cv::Mat(h_new, w_new, CV_8UC3, cv::Scalar::all(0));
        cv::Mat ROI_1 = combined_img(cv::Rect(0, 0, w_a, h_a));
        cv::Mat ROI_2 = combined_img(cv::Rect(0, h_a, w_g, h_g));
        aerial_image.copyTo(ROI_1);
        ground_image.copyTo(ROI_2);
        
		for (int i = 0; i < match_results.size(); i++) {
		//combine aerial-ground images in one to show the correspondences
         
            for (int j = 0; j < match_results[i].iid_aerials.size(); j++) {
                if (match_results[i].iid_aerials[j] == 60) {
                    for (int k = 0; k < match_results[i].iid_grounds.size(); k++) {
                        if (match_results[i].iid_grounds[k] == 25) {
                            // draw points on combined image
                            cv::line(combined_img,
                                        cv::Point(match_results[i].pt_aerials[j][0] - 10,
                                                match_results[i].pt_aerials[j][1]),
                                        cv::Point(match_results[i].pt_aerials[j][0] + 10,
                                                match_results[i].pt_aerials[j][1]),
                                        CV_RGB(0, 255, 255), 2, CV_AA, 0);
                            cv::line(combined_img,
                                        cv::Point(match_results[i].pt_aerials[j][0],
                                                match_results[i].pt_aerials[j][1] - 10),
                                        cv::Point(match_results[i].pt_aerials[j][0],
                                                match_results[i].pt_aerials[j][1] + 10),
                                        CV_RGB(0, 255, 255), 2, CV_AA, 0);
                            cv::line(combined_img,
                                        cv::Point(match_results[i].pt_grounds[k][0] - 10,
                                                match_results[i].pt_grounds[k][1] + h_a),
                                        cv::Point(match_results[i].pt_grounds[k][0] + 10,
                                                match_results[i].pt_grounds[k][1] + h_a),
                                        CV_RGB(0, 255, 255), 2, CV_AA, 0);
                            cv::line(combined_img,
                                        cv::Point(match_results[i].pt_grounds[k][0],
                                                match_results[i].pt_grounds[k][1] - 10 + h_a),
                                        cv::Point(match_results[i].pt_grounds[k][0],
                                                match_results[i].pt_grounds[k][1] + 10 + h_a),
                                        CV_RGB(0, 255, 255), 2, CV_AA, 0);

                            cv::line(
                                combined_img,
                                cv::Point(match_results[i].pt_aerials[j][0], match_results[i].pt_aerials[j][1]),
                                cv::Point(match_results[i].pt_grounds[k][0],
                                            match_results[i].pt_grounds[k][1] + h_a),
                                CV_RGB(0, 0, 255), 2, CV_AA, 0);
                        }
                    }
                }
            }
            
        }
        cv::imwrite("combine_image_matching.jpg", combined_img);

6. 匹配结果

在这里插入图片描述
准确率还是很客观的
缺点就是代码开源的时候readme文档写的太草率,routine没有写清楚,参数也没有写清楚,很崩溃

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

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

相关文章

【2023new】OAK相机如何将Yolov5转换成blob格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

机械革命极光Pro电脑开启出现英文代码无法启动怎么办?

机械革命极光Pro电脑开启出现英文代码无法启动怎么办&#xff1f;有的小伙伴在使用机械革命极光Pro电脑的时候&#xff0c;正常开启电脑却无法进入到桌面中&#xff0c;而是显示一些英文错误提示。遇到这个问题是我们的系统故障了&#xff0c;可以通过U盘重装系统的方法来进行问…

logback 自定义日志输出到数据库

项目日志格式 Spring Boot 的默认日志输出类似于以下示例&#xff1a; 2021-12-14 22:40:14.159 INFO 20132 --- [ main] com.kuangstudy.SpringbootApplication : Started SpringbootApplication in 2.466 seconds (JVM running for 3.617)输出以下项目&…

SpringBoot 整合 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议

续上一篇 Linux 中使用 docker-compose 部署 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议 前提&#xff1a;此篇文章是对上一篇文章的实战和项目中相关配置的使用&#xff0c;我这边针对 MongoDB 原有基础上做了增强&#xff0c;简化了 MongoDB 配置 SSL / TLS 协议上的支…

Android Studio引入JNI第三方库

一、前言 JNI作为Java与native沟通的桥梁&#xff0c;项目开发中难免要使用到&#xff1b;而我们除了自己开发JNI之外&#xff0c;有时候还要在Android Studio引入别人开源的C第三方库&#xff0c;并在jni层实现第三方库的调用。 二、流程 1.导入头文件和实现文件 将第三方…

Linux内核进程地址空间与进程内存布局

一&#xff0c;进程空间分布概述 对于一个进程&#xff0c;其空间分布如下图所示&#xff1a; 程序段(Text):程序代码在内存中的映射&#xff0c;存放函数体的二进制代码。初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。未初始化过的数据(BSS):在程序运行初未…

九龙证券|券商春季策略扎堆来袭 风格切换成焦点

2月以来&#xff0c;国泰君安、中信建投、国金证券等10余家券商组织相继发布2023年春季战略。综合来看&#xff0c;组织对A股持达观预期&#xff0c;未来两三个月A股商场或迎来重要切换。风格上&#xff0c;“中心财物&#xff0c;生长接力”或许成为上半年装备主线&#xff0c…

java 系列之Mybatis

java 系列文章 文章目录java 系列文章前言一、Mybatis 入门1.1 认识 框架&#xff08;了解&#xff09;1.2 认识 ORM&#xff08;要知道&#xff09;1.3 认识 Mybatis&#xff08;要知道&#xff09;二、Mybatis 使用2.1 创建maven项目并导入依赖2.2 准备数据库&#xff0c;包和…

释放内存流程

你好&#xff0c;我是安然无虞。 thread cache回收内存 当从 thread cache 中申请的内存对象使用完毕需要还回来的时候, 只需要计算出该内存对象对应 thread cache 中的哪一个自由链表桶, 然后将该内存对象插入进去即可. 不过需要注意的是, 如果不断有内存对象释放回来, 那么…

Java实现根据拼音首字母的排序

1.项目 手机APP端要对企业列表按企业名称首字母(如果企业名是英文的就按)进行分类排序&#xff0c;效果如下&#xff1a; 2.实现过程 2.1 首先引入项目的pinyin4j-2.5.0.jar包。 这个jar的下载地址如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1hkP_gGAYcgzyK_D…

跨链桥:Web3黑客必争之地

跨链桥&#xff0c;区块链的基础设施之一&#xff0c;所实现的功能是允许用户将自己的资产从一条链转移至另外一条链上&#xff0c;是连接不同的区块链的关键桥梁&#xff0c;常使用中心化的方式进行实现。由于跨链桥自身往往存储有用户所质押的巨额资产&#xff0c;是Web3黑客…

KUKA KR C4机器人与S7-1200PLC进行PROFINET通信的具体方法和步骤

KUKA KR C4机器人与S7-1200PLC进行PROFINET通信的具体方法和步骤 首先,从KUKA机器人控制柜中将KOP备选软件包拷贝出来,然后在“WorkVisual Development Environment”安装KUKA备选软件包(版本非常重要,尽量从控制柜中拷贝), 也可以从以下链接中获取: KUKA机器人PROFINET…

php 任务调度

在日常开发中&#xff0c;我们总会遇到一些在某个指定的时刻去执行&#xff0c;或是每隔xx时间执行&#xff0c;或是需要一直在后台监听的任务执行。基于这个需求&#xff0c;对于php我找了一些办法来实现这些功能 1、依赖于laravel的任务调度。 每隔xx时间执行一次命令&#…

七、虚拟机栈

虚拟机栈出现的背景 1.由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的&#xff0c;不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 2.优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同…

XC7K70T-1FBG676I【FPGA】XC3S200-4FTG256C参数XC7K70T-2FBG676C

Kintex-7 FPGA为快速增长应用和无线通信提供最优性价比和低功耗。Kintex-7 FPGA允许设计人员构建卓越带宽和12位数字可编程模拟&#xff0c;同时满足成本和功耗要求。Kintex-7内置支持8通道PCI Express (Gen1/Gen2)&#xff0c;用于连接主机系统。7系列器件利用Xilinx统一架构保…

如何实现外网跨网远程控制内网计算机?快解析来解决

远程控制&#xff0c;是指管理人员在异地通过计算机网络异地拨号或双方都接入Internet等手段&#xff0c;连通需被控制的计算机&#xff0c;将被控计算机的桌面环境显示到自己的计算机上&#xff0c;通过本地计算机对远方计算机进行配置、软件安装程序、修改等工作。通俗来讲&a…

超图软件许可过期后的处理

超图软件许可过期&#xff0c;博主犯了一个很低级的错误&#xff0c;特此发帖记录一下。 按照官网的介绍&#xff0c;直接申请新的许可&#xff0c;配置本地许可很简单的。 1.打开桌面软件会弹出以下的框。 2.配置本地许可对话框 3.切换到激活更新页面 4.选择激活文件即可 以…

内容团队如何快速出稿

对于内容团队而言&#xff0c;每个内容选题就相当于一个小项目&#xff0c;它们并非简单的线性工作流&#xff0c;相反其复杂程度不亚于一个小型工厂。一个内容选题会涉及内容形式&#xff0c;选题类型等多个变量&#xff0c;这些变量因素组合起来就是十几种不同类型的工作流。…

我花6个月从0开始面上大厂自动化测试岗,拿个20K不过分吧?

我是着急忙慌的准备简历——3年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f; 3年测试经验起码能要个20K吧&#xff1f;” 我一个朋友跟我说&#xff1a; “我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;…

03--框架基础

1、目录结构1&#xff09;创建项目使用测试号或小程序申请成功之后的appid即可&#xff0c;注意这里选择“不使用云服务”&#xff0c;选择javascript模板工具结构如图目录结构小程序包含一个描述整体程序的 app 和多个描述各自页面的 page。一个小程序主体部分由三个文件组成&…