opencv - 找到图像点的真实世界坐标

标签 opencv image-processing projection camera-calibration

我在互联网上搜索了很多资源很多天,但我无法解决问题。

我有一个项目,我应该在其中检测圆形物体在平面上的位置。由于在平面上,我只需要 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/

相关文章:

visual-studio - 使用Visual Studio的OpenCV中的链接器错误

c++ - 如何在 C++ 中使用 opencv 拼接 4 张图像

c - 使用 OpenCV 查找物体的高度

c++ - 如何在相机 - 投影仪系统中重新投影点(校准后)

c++ - OpenCV的Mat结构中存储的元素类型

python - Opencv TypeError : points is not a numpy array, 既不是标量

iphone - 2 个控制点的 Shephard 扭曲会扭曲整个图像 - ImageMagick Iphone sdk

r - 寻找图像边界

machine-learning - PCA重构中为什么要添加均值?

c# - Matrix3D 入门 (Silverlight)