我在互联网上搜索了很多资源很多天,但我无法解决问题。
我有一个项目,我应该在其中检测圆形物体在平面上的位置。由于在平面上,我只需要 x 和 y 位置(不是 z)为此目的,我选择进行图像处理。相机(单 View ,非立体)的位置和方向相对于平面上的引用坐标系是固定的,并且是已知的
我使用opencv检测了圆心的图像像素坐标。我现在需要的只是转换坐标。到现实世界。
http://www.packtpub.com/article/opencv-estimating-projective-relations-images
在本站点和其他站点中,单应变换被命名为:
p = C[R|T]P;其中 P 是真实世界坐标,p 是像素坐标(单应坐标)。 C 是表示内在参数的相机矩阵,R 是旋转矩阵,T 是平移矩阵。我遵循了在 opencv 上校准相机的教程(应用了相机校准源文件),我有 9 个精美的棋盘图像,作为输出,我有内在的相机矩阵,以及每个图像的平移和旋转参数。
我有 3x3 内在相机矩阵(焦距和中心像素)和一个 3x4 外在矩阵 [R|T],其中 R 是左 3x3,T 是右 3x1。根据 p = C[R|T]P 公式,我假设通过将这些参数矩阵乘以 P(world) 我们得到 p(pixel)。但我需要的是将 p(像素)坐标投影到地平面上的 P(世界坐标)。
我正在学习电气和电子工程。我没有学习图像处理或高级线性代数类(class)。正如我在线性代数类(class)中记得的那样,我们可以将变换处理为 P=[R|T]-1*C-1*p。然而,这是在欧几里得坐标系中。我不知道这样的事情在同形异义词中是可能的。此外 3x4 [R|T] 向量是不可逆的。此外,我不知道这是正确的方法。
已知内在和外在参数,我所需要的只是地平面上的真实世界项目坐标。由于点在平面上,坐标将是 2 维(深度不重要,作为反对单 View 几何的论点)。相机是固定的(位置,方向)。我应该如何在捕获的图像上找到点的真实世界坐标通过相机(单 View )?
编辑
我一直在阅读 Gary Bradski 和 Adrian Kaehler 的“学习 opencv”。在校准-> 单应性部分下的第 386 页上写道:q = sMWQ 其中 M 是相机内在矩阵,W 是 3x4 [R|T],S 是我认为与单应性概念相关的“高达”比例因子,我不知道清楚地知道。q 是像素坐标,Q 是实坐标。据说为了得到图像平面上检测到的物体坐标的真实世界坐标(在棋盘平面上); Z=0 然后也是 W=0 中的第三列(我假设轴旋转),修剪这些不必要的部分; W 是一个 3x3 矩阵。 H=MW 是一个 3x3 单应矩阵。现在我们可以反转单应矩阵并与 q 左乘得到 Q=[X Y 1],其中 Z 坐标被修剪。
我应用了提到的算法。我得到了一些不能在图像角之间的结果(图像平面与相机平面平行,正好在相机前面约 30 厘米,我得到了 3000 之类的结果)(棋盘方尺寸以毫米为单位输入,所以我假设输出的真实世界坐标再次以毫米为单位)。反正我还在尝试的东西。顺便说一下,结果以前非常非常大,但是我将 Q 中的所有值除以 Q 的第三个分量以获得 (X,Y,1)
最终编辑
我无法完成相机校准方法。无论如何,我应该从透视投影和变换开始。通过这种方式,我通过图像平面和物理平面之间的透视变换进行了很好的估计(通过两个平面上的 4 对对应的共面点生成了变换)。然后简单地对图像像素点应用变换。
最佳答案
你说“我有内在的相机矩阵,以及每个图像的平移和旋转参数。”但这些是从你的相机到你的棋盘的平移和旋转。这些与你的圆圈无关。但是如果你真的有平移和旋转矩阵,那么获得 3D 点真的很容易。
将逆内在矩阵以齐次表示法应用于屏幕点:C-1*[u, v, 1],其中 u=col-w/2 和 v=h/2-row,其中 col、row 是图像列和row 和 w, h 是图像的宽度和高度。因此,您将获得具有所谓的相机标准化坐标 p = [x, y, z]T 的 3d 点。您现在需要做的就是减去平移并应用转置旋转:P=RT(p-T)。操作顺序与原先旋转然后平移的顺序相反;请注意,转置旋转执行与原始旋转相反的操作,但计算速度比 R-1 快得多。
关于opencv - 找到图像点的真实世界坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389896/