【代码详解】点云融合dypcd方法

MVS深度图估计之后,需要融合成点云提交给benchmark来评测,而融合方式和实现版本多种多样,参数也丰俭由人,所以一直是trick高发区。今天来详解一下其中的dypcd融合。

该方法最初应该是由D2HC-RMVSNet提出,这篇文章是ECCV 2020的spotlight。该方法在tanks and temples上效果不错,后续逐渐被广泛使用。

这个融合主要有两个函数,一个是filter_depth,一个是check_geometric_consistency。本文会省去读取深度图保存点云等操作的解读,主要讲每个超参数被如何使用,它们怎样影响到点云融合结果。

这套融合方法,细究之下,其实有这些参数:

  • s,指从几开始迭代
  • e,指迭代到几结束
  • dist_base绝对距离误差
  • rel_diff_base相对距离误差

filter_depth

读取深度图,但是不是所有pixel都valid,需要判断超过conf置信度的才使用,所以我们首先有这么个光度一致性的mask。

confidence = read_pfm(os.path.join(out_folder, 'confidence/{:0>8}.pfm'.format(ref_view)))[0]
photo_mask = confidence > args.conf

接下来要有几何一致性了。

        # compute the geometric maskgeo_mask_sum = 0dy_range = egeo_mask_sums = [0] * (dy_range - s)for src_view in src_views: # 10 views# camera parameters of the source viewsrc_intrinsics, src_extrinsics = read_camera_parameters(os.path.join(scan_folder, 'cams/{:0>8}_cam.txt'.format(src_view)))# the estimated depth of the source viewsrc_depth_est = read_pfm(os.path.join(out_folder, 'depth_est/{:0>8}.pfm'.format(src_view)))[0]masks, geo_mask, depth_reprojected, x2d_src, y2d_src, x2d_reprojected, y2d_reprojected = check_geometric_consistency(ref_depth_est, ref_intrinsics,ref_extrinsics, src_depth_est,src_intrinsics, src_extrinsics, confidence)geo_mask_sum += geo_mask.astype(np.int32)for i in range(s, dy_range):geo_mask_sums[i - s] += masks[i - s].astype(np.int32)

注意这里开始出现超参数了。对于每一个src视角,都会得到一个geo_mask,这个变量的含义是该像素在该视角的时候是不是几何一致的,而geo_mask_sum在不断的添加geo_mask,其实是在统计,这么些src视角当中,这个像素,在多少个视角哪是几何一致的。

这个最后从s到dy_range的循环当中,其实就是我们前面所说的从几开始迭代到几结束,因为dy_range=e在前面赋值了。这里的含义是,在某阶段i,有前i个view都满足条件。

再看后面的代码,会发现:

        geo_mask = geo_mask_sum >= dy_rangefor i in range(s, dy_range):geo_mask = np.logical_or(geo_mask, geo_mask_sums[i - s] >= i)final_mask = np.logical_and(photo_mask, geo_mask)

这里geo_mask第一次赋值得到的是在mask累加之后要所有视角下都能满足几何一致性,这个条件是很严格的,如果只有这一步,那满足条件的点就太少了。因此,紧接着开始放宽松条件,逐步把更多的点纳入进来。这个逻辑或当中添加的像素,似乎在说如果前i个view能满足某种条件的数量足够多那也是可以的。那我们不禁好奇,这个check_geometric_consistency函数返回来的masks和geo_mask到底分别表示什么含义。于是我们顺理成章地进入到这一个函数中查看。

check_geometric_consistency

    depth_diff = np.abs(depth_reprojected - depth_ref)relative_depth_diff = depth_diff / depth_refmask = Nonemasks = []for i in range(s, e):mask = np.logical_and(dist < i * dist_base, relative_depth_diff < math.log(max(i, 1.05), 10) * rel_diff_base)masks.append(mask)

在这里,我们发现,出现了新的超参数dist_base和rel_diff_base,这两个变量涉及到了重投影误差的threshold,即到底小于多少的绝对误差和相对误差才是可以被接受的。

通过循环我们发现,从s开始到e,base的倍数在不断加大,只有绝对误差和相对误差同时小于阈值的像素,才会被视为有效。而masks变量在不断记录的是:在当前i这个倍数下,哪些像素是符合该要求的。

观察返回值我们发现包括masks与mask,刚好对应了filter_depth里面的masks和geo_mask。可见,geo_mask对应的是:在最宽松的约束下(i为e-1的时候),哪些像素是可靠的;masks对应的是,在第i次迭代的时候(条件更严格的时候),哪些像素是可靠的。这些针对每个src view的统计最终被汇聚到了geo_mask和geo_mask_sums中,来表征在各个条件下,有多少个视角认为该像素可靠。

总结

通过这个分析,我们发现,该融合方法的整体思路是:在每个视角下,都按照从严格到宽松来不断纳入新的点,并且对每次迭代放宽条件之后的mask进行记录,最后把所有视角的mask综合到一起来判断。并且,综合判断的思路是,如果该像素在很严苛的范围内(比如绝对误差和相对误差都很小,i=2就满足了)满足条件,那它并不需要所有视角都赞同,相反地,如果误差越大,那么就需要更多的src view都支持它有效,才可以被纳入考虑。

除了距离base之外,迭代的起始与终止也会影响到融合。大体上描述的话,s设得越小,就越宽松,也对异常值越敏感,比如有2个view觉得啊对对对,但是其他view都觉得不行,也会被纳入有效;end设得越小,就越严格,虽然给予的base空间更大了,但是需要大多数都同意有效才可以。

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

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

相关文章

Vue70-路由的几个注意点

一、路由组件和一般组件 1-1、一般组件 1-2、路由组件 不用写组件标签。靠路由规则匹配出来&#xff0c;由路由器渲染出来的组件。 1-3、注意点1 一般组件和路由组件&#xff0c;一般放在不同的文件夹&#xff0c;便于管理。 一般组件放在components文件夹下。 1-4、注意点…

C语言从头学24——函数原型

前面学习函数时已经知道必须先存在一个函数然后才能使用&#xff0c;且这个函数的位置还要在 main()函数之前&#xff0c;否则的话编译时会报错。但我们写程序时&#xff0c;main() 函数是程序入口&#xff0c;程序的主要部分都在 main() 函数中&#xff0c;且其它函数也都要通…

[Linux内核驱动]自旋锁

自旋锁&#xff08;spinlock&#xff09; 更多内容可以查看我的github 概念 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。 正因为如此…

河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!

河南大学&#xff08;Henan University&#xff09;&#xff0c;简称“河大”&#xff0c;是河南省人民政府与中华人民共和国教育部共建高校&#xff0c;国家“双一流”建设高校&#xff0c;入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人…

RFID优缺点和应用场景

一、RFID技术特点 优点 快速扫描&#xff1a;RFID识别器可以同时读写多个RFID标签&#xff0c;读取速度非常快。有源RFID系统的草图功能可以用于交互式服务&#xff0c;如过程跟踪和维护跟踪。 小型化和形状多样化&#xff1a;RFID标签向小型化和多样化方向发展&#xff0c;以…

怎么用二维码在线下载视频?视频用二维码下载的制作方法

怎么把视频转换成二维码之后还可以下载视频呢&#xff1f;现在使用二维码的方式来分享视频内容在很多行业和场景中都有应用&#xff0c;这种方式能够更加简单快捷的完成视频的传播分享&#xff0c;那么怎么让扫码者可以自由选择下载视频呢&#xff1f;下面来给大家分享扫码下载…

SQL server LAG方法改造 适配 SQL server 2008

LAG函数 方法 需要改造为 适配 SQL server 2008 ---改造前&#xff1a; select area_id, area_name, year, lag(cast(year as int ),1,1970) over (partition by area_id order by year) previous_year, …

深入探索C++中的AVL树

引言 在数据结构和算法的世界里&#xff0c;平衡二叉搜索树&#xff08;Balanced Binary Search Tree, BST&#xff09;是一种非常重要的数据结构。AVL树&#xff08;Adelson-Velsky和Landis发明的树&#xff09;就是平衡二叉搜索树的一种&#xff0c;它通过自平衡来维护其性质…

zookeeper + kafka消息队列

zookeeper kafka 消息队列 一、消息队列简介 1、什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种用于跨进程或分布式系统中传递消息的通信机制。消息队列在异步通信、系统解耦、负载均衡和容错方面具有重要作用。 &#xff08;1&#xff09;特性 异步…

c++ 里构造函数的形参与数据成员的同名问题

如题&#xff0c;这时&#xff0c;或许在 java 里&#xff0c;会报语法错误。但在 c vs2019 开了 c20语法规范。这不再是错误。这样的好处是解决了咱们的起变量名的麻烦&#xff1a;重名现在已不是错误&#xff0c;编译器可以解决了。测试如下&#xff1a; 我们看看 c 编译器是…

如何正确理解和评估品牌价值?

在当今这个品牌林立的商业世界里&#xff0c;我们常常听到企业家们满怀憧憬地谈论品牌梦想。 但究竟是什么驱使这些企业去打造一个品牌&#xff0c;到底是市场的激烈竞争&#xff0c;还是内心的情感寄托&#xff1f;亦或是社会发展的必然趋势&#xff0c;引领我们追求超越产品…

C++ using 关键

先上代码 example 1&#xff1a; template <typename T> class Blocker : {public:using MessageType T;using MessageShrPtr std::shared_ptr<T>;using MessageQueue std::deque<MessageShrPtr>;using Callback std::function<void(const MessageS…

1969python房屋租赁管理系统mysql数据库Flask结构BootStrap布局计算机软件工程网页

一、源码特点 python Flask房屋租赁管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 python flask 房屋租赁管理系统 开发环境pycharm mysql …

SpringBoot 项目,三种方式实现打印 sql 日志

方式一&#xff1a;指定mybatis日志级别 # application.yml mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 等价于application.properties mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl方式二、Mybatis-Plus…

酱香型白酒派系介绍

酱香型白酒作为中国传统白酒的重要流派&#xff0c;以其独特的酱香和复杂的酿造工艺而著称。在酱香型白酒中&#xff0c;形成了多个派系&#xff0c;各具特色。 以下是关于北派、茅派、川派和黔派等各个派系的详细介绍。 一、北派 地理位置&#xff1a;主要产于秦岭和淮河以…

AWS无服务器 应用程序开发—第十五章 CI/CD

创建一个针对 AWS Lambda 的 CI/CD 管道&#xff0c;可以大大提高开发和部署的效率和可靠性。以下是一个完整的示例&#xff0c;包括从 CodeCommit 开始的代码管理、使用 CodeBuild 进行单元测试、使用 CodePipeline 进行持续集成和持续部署 (CI/CD) 的具体步骤。 步骤 1&…

记一次通过脚本来实现自定义容器的自动重启

通过脚本来实现自定义容器的自动重启 1. 场景还原2. 自定义启动脚本3. 使用自定义脚本来作为容器启动的脚本4. 制作自定义脚本作为入口点的新镜像5. 测试新镜像启动是否走自定义启动脚本 1. 场景还原 现在我有一个自定义的Docker镜像&#xff0c;是基于基础镜像来构建的带有多…

【React】React 的StrictMode作用是什么,怎么使用?

React的<StrictMode>是一个用于在开发环境中检测潜在问题的工具,它可以帮助开发者在开发阶段识别并解决一些常见的编码问题,从而提高代码质量和应用的可靠性。以下是<StrictMode>的详细作用和使用方法: 作用 检测潜在问题:<StrictMode>会启用一些额外的…

Windows 图像处理组件(WIC)读写位深度24位的 bmp 文件

我写了类封装了一下。只是作业需要&#xff0c;缺少错误处理。 #include <wincodec.h>enum PixColor { B, G, R };struct ComEnv {ComEnv(){CoInitialize(nullptr);CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&fac));…

一文了解HarmonyOSNEXT发布重点内容

华为在2024年6月21日的开发者大会上正式发布了HarmonyOS NEXT版&#xff0c;这是华为在操作系统领域的一次重大飞跃&#xff0c;标志着华为在构建全场景智能生态方面的卓越成就。HarmonyOS NEXT版不仅带来了全新的系统架构和性能提升&#xff0c;还首次将AI能力融入系统&#x…