我正在开发一个 Android 应用程序,我想在其中跟踪 2D 图像/一张纸,分析用户在其上写/画的内容,并在其上正确显示不同的 3D 内容。
我正在研究跟踪和显示简单的 3D 内容部分,这实际上可以使用 Vuforia 和 Wikitude 等 SDK 来实现。但是,我不使用它们有几个原因。
- 还需要对图像进行其他分析,例如图纸分析。
- 图像可能没有那么丰富的特征,例如带有线条或一些图形的纸张。
- 像 Vuforia 这样的 SDK 可能不会向开发人员公开一些底层功能,如特征检测等。
无论如何,现在我只想达到以下结果。
- 我有一张纸,上面可能有线条和数字。你可以把它想象成一种让孩子们练习写作或绘画的纸。示例:https ://i.pinimg.com/236x/89/3a/80/893a80336adab4120ff197010cd7f6a1--dr-seuss-crafts-notebook-paper.jpg
- 在捕捉视频帧时,我将手机(相机)对准纸张。
- 我想注册纸张,跟踪它并在上面显示一个简单的线框立方体。
我一直在使用 OpenCV,并尝试了以下方法。
使用单应性:
- 检测 2D 图像中的特征(ORB、FAST 等)。
- 描述特征(ORB)。
- 在每个视频帧中执行相同的操作。
- 匹配特征并找到好的匹配。
- 找到单应性,使用单应性并成功在视频帧中的图像周围绘制一个矩形。
- 不知道如何使用单应性分解(旋转、平移和法线)来显示像立方体一样的 3D 对象。
使用solvePnP:
1~4与上述相同。
- 通过假设图像位于世界的 xy 平面上,将图像中的所有 2D 良好匹配点转换为 3D,因此所有匹配点的 z = 0。
- 对当前帧中的那些 3D 点和 2D 点使用 solvePnP 来检索旋转和平移向量,并使用 OpenCV 中的 Rodrigues() 进一步将其转换为投影矩阵。
- 构建立方体的 3D 点。
- 使用投影和相机矩阵将它们投影到 2D 图像中。
- 问题是立方体跳来跳去,我认为这是由于特征检测和映射不稳定和准确,从而影响solvePnP。
使用轮廓或角:
我只是对相机框架进行灰度化,对其进行高斯平滑,扩大或侵蚀它并尝试找到最大的 4 边缘轮廓,以便我可以使用solvePnP 等跟踪它。不出所料,这并没有给出好的结果,或者我'我只是做错了。
所以我的问题是:
- 如何解决上面提到的两个大胆的问题。
- 更一般地说,给定我要跟踪的图像目标的类型,跟踪它的最佳算法/解决方案/技术是什么?
- 在解决问题的方式中,我可以改进/改变哪些事情?
非常感谢。