我正在开发一款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与上述相同。
- 假设图像位于世界的x-y平面上,将图像中的所有2D良好匹配点转换为3D,因此所有都具有z = 0.
- 将solvePnP与当前帧中的3D点和2D点一起使用,以检索旋转和平移向量,并使用OpenCV中的Rodrigues()进一步将其转换为投影矩阵。
- 构建多维数据集的3D点。
- 使用投影和相机矩阵将它们投影到2D图像中。
- 问题是多维数据集正在跳跃,我认为这是由于特征检测和映射不稳定和准确,从而影响solvePnP。
醇>
使用轮廓或角落:
我只是对相机框架进行灰度渲染,高斯光滑,扩大或侵蚀它,并尝试找到最大的4边缘轮廓,以便我可以使用solvePnP等跟踪它。不出所料,这并不能让人感觉良好结果,或者我做错了。
所以我的问题是:
- 如何解决上述两个粗体问题。
- 更一般地说,考虑到我想跟踪的图像目标类型,跟踪它的最佳算法/解决方案/技术是什么?
- 在解决问题的过程中,我可以改进/改变哪些事情?
非常感谢。