本文高度致敬张正友的文章《A Flexible New Technique forCamera Calibration》,同时介绍如何在 OpenCV 中实现其方法。虽然看不懂原理,不过东拼西凑姑且能弄出个能用的纯过程代码,放在这里供大伙看个乐。
归档 | 目录 | 时间直角 | 关于 |
本文高度致敬张正友的文章《A Flexible New Technique forCamera Calibration》,同时介绍如何在 OpenCV 中实现其方法。虽然看不懂原理,不过东拼西凑姑且能弄出个能用的纯过程代码,放在这里供大伙看个乐。
前几日和朋友聊起各式音游,对解包产生了很大兴趣。当然也被科普了各种防逆向知识,由此想罗列一番做个随笔。
加壳的目的无非两种:压缩或加密。类似于 Minecraft Forge,在运行时中将所需要的字节码转入内存中,这种方式能很好地隐藏 OEP。
而对策便是直接替换class loader,将写入内存的部分输出到文件中,便能获取到所有运行时源码。
在《Project SEIKAI》中,游戏资源被一种特殊的方式所加密。其步骤为:开头128个字节每8个字节的前5个字节二进制取反。这种方法可谓异常简单,只需对比一遍原生 Unity 未加密的资源包二进制文件就能找出规律。
refer: 解包PJS资源的进一步探索, 黑鲸.
这种方式是将在指令头做一个映射,修改译码过程。这种方式可能连操作系统都不一定能捕捉到。
加壳的方式非常之多,还有 int3 陷阱等不再赘述。我也推荐他试着逆向原神,不过难度确实很大,据我所知成功的也仅寥寥几人。日厂手游开发中 Unity 使用率越来越高,这也导致了很多 Unity 上的安全问题能在各种产品中重现。而回忆当年《Love Live!》用的自家引擎,也算是一种原始的加壳方式吧。
原文标题:Rapid 3D Reconstruction for Image Sequence Acquired from UAV Camera
首发于:MDPI
Yufu Qu *, Jianyu Huang and Xuan Zhang
Department of Measurement Technology & Instrument, School of Instrumentation Science & Optoelectronics
Engineering, Beihang University, Beijing 100191, China; Hjy448@buaa.edu.cn (J.H.);
zhangxuanaj@buaa.edu.cn (X.Z.)Correspondence: qyf@buaa.eud.cn; Tel.: +86-010-8231-7336
Received: 23 November 2017; Accepted: 11 January 2018; Published: 14 January 2018
摘要
1 | In order to reconstruct three-dimensional (3D) structures from an image sequence captured by unmanned aerial vehicles’ camera (UAVs) and improve the processing speed, we propose a rapid 3D reconstruction method that is based on an image queue, considering the continuity and relevance of UAV camera images. |
为了加快无人机相机采集图像三维重建过程,我们提出了一种基于图像序列相关度的快速重建方法。
1 | The proposed approach first compresses the feature points of each image into three principal component points by using the principal component analysis method. In order to select the key images suitable for 3D reconstruction, the principal component points are used to estimate the interrelationships between images. |
该方法首先利用主成分分析法(Principal Components Analysis, PCA)将每幅图像的特征点压缩为 3 个主成分点。利用主成分点估计图像之间的相互关系,可以为选择适合三维重建的关键帧提供依据。
1 | Second, these key images are inserted into a fixed-length image queue. The positions and orientations of the images are calculated, and the 3D coordinates of the feature points are estimated using weighted bundle adjustment. With this structural information, the depth maps of these images can be calculated. |
其次,将这些关键帧插入到一个固定长度的图像队列中。计算图像的位置和方向,并使用加权束平差(weighted bundle adjustment)估计特征点的三维坐标。利用这些结构信息,可以计算出这些图像的深度图。
1 | Next, we update the image queue by deleting some of the old images and inserting some new images into the queue, and a structural calculation of all the images can be performed by repeating the previous steps. |
接着通过删除一些旧图像和插入一些新图像来更新图像队列,并重复前面的步骤对所有图像进行结构化计算。
1 | Finally, a dense 3D point cloud can be obtained using the depth–map fusion method. The experimental results indicate that when the texture of the images is complex and the number of images exceeds 100, the proposed method can improve the calculation speed by more than a factor of four with almost no loss of precision. |
最后利用深度图融合方法得到密集的三维点云。实验结果表明,当图像的纹理复杂且图像数量超过 100 时,该方法可以将计算速度提高 4 倍以上,几乎不损失精度。
1 | Furthermore, as the number of images increases, the improvement in the calculation speed will become more noticeable. |
此外,随着图像数量的增加,相较原方法计算速度也会明显地提高。
Keywords: UAV camera; multi-view stereo; structure from motion; 3D reconstruction; point cloud
本文记录了摸模板的心路历程,卖惨自闭随处可见。
上回说到如何访问 Entity 所拥有的 Components,这一章将会探索如何储存 Component 数据。久闻 ECS 以高性能自称,来看看它到底有何能耐。
首先来看几个概念:
[Position, Health]
。我们可以通过这两个概念来构造 ECS 中最基础的数据结构,即 Entity Index:
1 | using EntityId = uint64_t; |
通过 EntityId
我们可以很容易获取该 Entity 所拥有的组件列表,那么实现一个 HasComponent
便易如反掌:
1 | bool HasComponent(EntityId entity, ComponentId component) { |
针对 C++ 的特性,在添加组件时可以用模板的形式绑定就再好不过了:
1 | Player.add<Position>(); |
在这两个 add
操作之后,entityIndex
中就应该包含一项绑定 Player
与 [Position, Health]
的数组元素。当然,是以 ComponentId
,即 uint64_t
的形式定义的,例如:
1 | ComponentId Position_id = 1; |
如此一来,Player 这一 Entity 的 Type 便成了 [1, 2]
。