惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
罗磊的独立博客
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
博客园 - 叶小钗
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题
博客园 - 【当耐特】
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
量子位
宝玉的分享
宝玉的分享
V
Visual Studio Blog
博客园_首页
IT之家
IT之家
V
V2EX
腾讯CDC
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Blog — PlanetScale
Blog — PlanetScale
I
InfoQ
有赞技术团队
有赞技术团队
J
Java Code Geeks
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
H
Help Net Security

0x7f Blog

telephony42 完全指南:从零开始在 dn42 构建电话网络 telephony42 完全指南:从零开始在 dn42 构建电话网络 在 Telephony42 中配置 E.164 ENUM 在 Telephony42 中配置 E.164 ENUM 有关 DN42 的本质及诸多暴论 有关 DN42 的本质及诸多暴论 线香简评(持续更新) 线香简评(持续更新) 美味冰淇淋的制作方法 美味冰淇淋的制作方法 一场有关数字世界自决权的战争 一场有关数字世界自决权的战争 在 rDNS 上念诗!(加强版) 在 rDNS 上念诗!(加强版) 木桶饭杂谈 其二 木桶饭杂谈 其二 木桶饭杂谈 其一 木桶饭杂谈 其一 杂牌对讲机的写频 杂牌对讲机的写频 科研随想 (21.09) 科研随想 (21.09) IFSolver Reloaded 系列 0x03:解码生成 IFSolver Reloaded 系列 0x03:解码生成 IFSolver Reloaded 系列 0x02:特征匹配 IFSolver Reloaded 系列 0x01:特征提取与存储 IFSolver Reloaded 系列 0x01:特征提取与存储 新站点启用,以及一些小细节 新站点启用,以及一些小细节 IFSolver Reloaded 系列 0x00:总体结构 IFSolver Reloaded 系列 0x00:总体结构 IFSolver 的原理解析 IFSolver 的原理解析 博客静态迁移 博客静态迁移 DN42系列 0x03:Peer Finder & Looking Glass DN42系列 0x02:Peering DN42系列外传 0x00 : 利用Nebula建立p2p网络 日常翻车实录 日常翻车实录 智(能)(避)障小车项目研究 基本思路 智(能)(避)障小车项目研究 基本思路 五月站点更新
IFSolver Reloaded 系列 0x02:特征匹配
YukariChiba · 2021-08-19 · via 0x7f Blog

在这篇文章里,将详细介绍 IFSolverR 是如何匹配特征的,这是本次更新中最核心的环节。

简要介绍

与先前的 IFSolver 不同,使用 SIFT 进行全图匹配一定会引入一些错误的特征点,如何判断某个匹配是否是符合要求的,以及如何处理图中存在的多个匹配,是本节需要关注的主要问题。

粗匹配

1
bestMatches = BFMatcher.matchDescriptor(d, dFull)

通过这样的过程,可以实现对 d(Portal 图片特征) 和 dFull(IFS 谜题全图特征) 的暴力匹配。

BFMatcher 里面是这样的:

1
2
matches = matcher.knnMatch(descriptor, descriptorFull, k=2)
bestMatches = [[m] for m, n in matches if m.distance < 0.6*n.distance]

通过测量,0.6 倍距离作为筛选边界是较为合适的,这会影响到检测到的特征点个数。

筛选匹配

然而,这样产生的匹配很可能也存在不符合标准的状况。嘤为 SIFT 本身是一种匹配能力极强的算法,当遇到稍有相似但角度不同的 Portal 图片时,依然能够被识别出来并被认为是一个合理的匹配。

同时,我们需要做的并不只是匹配图片,还需要找到匹配区域的几何中心,即图片的中心点,以方便后续的自动化生成解谜结果。

但很显然,一次匹配是无法区分出所有的匹配图片,并进行筛选的,因此我们需要这样的操作:

  1. 通过映射关系,查找 Portal 图片在谜题图片上的边缘,这里就是对图片生成一个 3x3 的最优单映射变换矩阵(矫正矩阵) M,使得 $ A_{portal} * M = A_{puzzle} $。
  2. 然而,这样的矩阵并不一定存在,如果不存在这样的矩阵,说明这不是一个有效的组合。
  3. 排除以上情况后,可以通过 perspectiveTransform 和上述矩阵 M 确定变换后的边缘坐标。
  4. 同时,我们需要保证这样的坐标的长宽比符合要求,并且是一个凸多边形。
  5. 随后,我们对匹配的区域生成一个 mask,将上述匹配成功的区域内的特征点排除(logical_not)。
  6. 重复以上操作直至匹配到的特征点低于 4 个,此时我们不认为它们能确定一个映射,匹配过程结束。

然后程序也会存储一份特征匹配的图片以供参考和调试。

拓展

在下一节还会讲到,这样的匹配规则依然会存在重复匹配和错误匹配的可能性(虽然不高),因此在需要人工干预会有提示。如何进一步提升匹配的准确性,可能的办法是,将区域重叠率高的图片进行裁剪,进行 1:1 匹配,然后再根据匹配吻合度优选。