我想定义一个投影到图像内某个平面上的坐标系。我只需要一些关于如何实现这一点的提示和想法,不一定是代码,但一切都值得赞赏!如果提供了代码,在以 Python 为语言的 OpenCV 中将是首选。
示例:我有一张从某些角度看的桌子图像。我使用放置在桌面上的棋盘图案拍摄了 N 张校准图像。我们可以想象它是一个平面的斯诺克台球桌。我已经计算了内在/外在校准矩阵、单应矩阵,我可以将图像投影到我的桌面上——一切都很好。但是现在我想在桌面上创建一个坐标系。如果我知道桌面的尺寸是 1 米乘 2 米,我想要一个函数,我可以说:给我图像中对应于点的 2d 像素坐标(x=0.75 米,y=1.65 米) 在桌面表面上。我希望原点从桌面的左上角开始,但这应该只是一个翻译问题。我怎样才能使这个坐标系和相应的功能来“使用”它?
我提出了两种可能的方法,但似乎都非常无效,我相信必须存在一种更有效和更强大的方法。
1:在我的校准过程中,我在桌面上放置了 N 个不同的校准图案图像。这给了我 N 个局部坐标系,一个用于每个校准模式。由于每个校准图案都留在桌面上,因此 x 轴和 y 轴将始终位于同一平面上。使用这个OpenCV指南我可以绘制沿着桌面平面的轴,每个点都匹配为棋盘格的大小,所以我有一个工作公制转换米到像素。最大的问题是,如果棋盘边缘不平行于桌子边缘,那么我的坐标系就会错位。另一个问题是,通过有 N 个小坐标系,我必须选择一个任意一个,然后手动找到它到左上桌面位置的对应平移,并围绕 origo 旋转以重新对齐轴。这使得解决方案非常手动,并且难以动态化。最终,最好在像素值中定义 4 个手动识别的表格边缘,然后需要任何派生值,例如单应矩阵、旋转矩阵、平移矩阵等。
2:我可以生成坐标网格的图像,然后将此图像网格投影到我的桌面图像上。该技术将与此类似。然后我会扩充我的原始桌面图像以包含一个已正确转换的网格(即靠近相机的网格坐标方块大于更远的网格坐标方块)。然而,这并不能让我从绘制的网格中提取坐标。如果我可以投影一个网格而不是图像,那将是一个非常简单的解决方案。据我在 OpenCV 文档中看到的,这是不可能的。