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

时间:2014-03-13 20:14:20

标签: opencv image-processing projection camera-calibration

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

我有一个项目,我应该在飞机上检测圆形物体的位置。因为在一个平面上,我所需要的只是x和y位置(不是z)为此我选择了图像处理。相机(单视图,非立体)位置和方向相对于平面上的参考坐标系统是固定的并且是已知的

我使用opencv检测到圆心的图像像素坐标。我现在需要的只是改变坐标。到现实世界。

http://www.packtpub.com/article/opencv-estimating-projective-relations-images 在这个站点和其他站点中,同形转换命名为:

p = C [R | T] P;其中P是真实世界坐标,p是像素坐标(在单应坐标系中)。 C是表示内在参数的相机矩阵,R是旋转矩阵,T是平移矩阵。我已经按照在opencv上校准相机的教程(应用了cameraCalibration源文件),我有9个精美的chessbordimages,作为输出我有内在的相机矩阵,以及每个图像的平移和旋转参数。

我有3x3内在相机矩阵(焦距和中心像素),以及3x4外在矩阵[R | T],其中R是左3x3,T是3x1。根据p = C [R | T] P公式,我假设通过将这些参数矩阵乘以P(世界),我们得到p(像素)。但我需要的是将p(像素)坐标投影到地平面上的P(世界坐标)。

我正在学习电气和电子工程。我没有进行图像处理或高级线性代数课程。我记得从线性代数课程中我们可以操纵变换为P = [R | T] -1 * C-1 * p。然而,这是在欧几里得协调系统中。我不知道在hompographic中这样的事情是可能的。而且3x4 [R | T]向量不可逆。而且我不知道这是正确的方法。

知道内在和外在参数,我需要的是地平面上的真实世界项目坐标。由于点在平面上,坐标将是2维(深度并不重要,作为与单视图几何相对的参数)。相机是固定的(位置,方向)。如何在捕获的图像上找到点的真实世界坐标通过相机(单一视图)?

修改 我一直在阅读Gary Bradski和他的“学习opencv”。阿德里安凯勒。在校准 - > Homography部分下的第386页,它写成:q = sMWQ其中M是相机固有矩阵,W是3x4 [R | T],S是我认为与单应性概念相关的“达到”比例因子,i不清楚.q是像素库,Q是真正的coord。据说为了获得在图像平面上检测到的物体的坐标的真实世界坐标(在棋盘平面上); Z = 0然后W = 0中的第三列(假设轴旋转),修剪这些不必要的部分; W是3x3矩阵。 H = MW是一个3x3的单应矩阵。现在我们可以反转单应矩阵并左移乘q得到Q = [X Y 1],其中Z coord被修剪。

我应用了上面提到的算法。我得到了一些不能在图像角落之间的结果(图像平面与摄像机平面平行,距摄像机约30厘米,我得到的结果就像3000)(棋盘方形尺寸以毫米为单位输入,所以我假设输出的真实世界坐标再次以毫米为单位)。无论如何,我还在努力。顺便说一下,结果非常非常大,但我将Q中的所有值除以Q的第三个分量得到(X,Y,1)

最终编辑

我无法完成相机校准方法。无论如何,我应该从透视投影和变换开始。这样,我通过图像平面和物理平面之间的透视变换(通过两个平面上的4对相应的共面点生成变换)进行了很好的估计。然后简单地在图像像素点上应用变换。

1 个答案:

答案 0 :(得分:7)

你说"我有内在的相机矩阵,以及每个图像的平移和旋转参数。“但这些是从相机到棋盘的平移和旋转。这些与你的圈子无关。但是,如果你真的有平移和旋转矩阵,那么获得3D点非常容易。

以均匀符号将逆内在矩阵应用于屏幕点:C -1 * [u,v,1],其中u = col-w / 2且v = h / 2- row,其中col,row是image列和行w,h是图像的宽度和高度。结果,您将获得具有所谓的相机标准化坐标p = [x,y,z] T 的3d点。您现在需要做的就是减去平移并应用转置旋转:P = R T (p-T)。操作顺序与旋转然后翻译的原始顺序相反;请注意,转置旋转对原始旋转执行逆操作,但计算速度比R -1 快得多。