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

15

我在互联网上搜索了很多资源,但是多日来都没有解决问题。

我有一个项目需要检测平面上圆形物体的位置。由于在平面上,我只需要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张精细的棋盘图像,并且作为输出,我有每个图像的内部相机矩阵和平移旋转参数。

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

我正在学习电气和电子工程。我没有学习过图像处理或高级线性代数课程。从线性代数课程中,我记得我们可以将变换操作为P=[R|T]-1*C-1*p。但是这在欧几里得坐标系中。我不知道在同态坐标系中是否可能存在这样的事情。此外,3x4 [R|T]向量无法求逆。而且我不知道这是正确的方法。

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

编辑 我正在阅读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对对应的共面点生成变换)进行了很好的估计。然后简单地将变换应用于图像像素点。


也许这个其他的线程可以帮到您 https://dev59.com/rmsz5IYBdhLWcg3wiISe 祝好运! - blacatus
我有同样的问题,你能告诉我最终你是怎么找到协调器的吗?我使用了这个公式 P=C^-1 * R^-1 * (p-t),但是我得到了像你提到的那样的大数字。 - Rashed DIP
1个回答

9
您说:“我有内在相机矩阵,以及每张图像的平移和旋转参数。”但是这些是从您的相机到棋盘的平移和旋转,并与您的圆圈无关。但如果您真的有平移和旋转矩阵,那么获取3D点非常容易。
将逆内在矩阵应用于齐次符号中的屏幕点:C-1*[u, v, 1],其中u=col-w/2,v=h/2-row,其中col,row是图像列和行,w,h是图像宽度和高度。结果,您将获得带有所谓相机归一化坐标的3D点p=[x,y,z]T。现在您只需要减去平移并应用转置旋转:P=RT(p-T)。操作顺序与原始顺序相反,先是旋转然后是平移;请注意,转置旋转执行原始旋转的反向操作,但计算速度比R-1要快得多。

谢谢Vlad耐心阅读我的长篇问题并回答。我在原帖中找到了一些关于学习OpenCV的东西。我还将尝试减去平移并应用反向旋转。顺便说一下,我的意思是我正在尝试获取相对于棋盘原点的圆形坐标。我假设通过这些矩阵和向量,我可以得到图像上检测到的圆的真实坐标(通过一些图像处理,我有圆的中心像素坐标)在棋盘平面上。我错了吗? - user3417020
能够看到你的设置或图形图表会很有用。除非你使用直尺测量它们相对于棋盘的物理位置,否则我不确定你如何学习圆的位置和旋转。或者可能圆是印在棋盘上的,并且你知道它们的确切位置。顺便说一下,你的现实世界系统是以摄像机为中心的,对吗? - Vlad
以下是项目的设置链接。左侧是“项目设置”的俯视图,右侧是“右视图”。您可以看到相机位于地平面的中心。相机的高度和角度是固定的。地平面上的红色圆圈被处理并找到像素坐标。我的意图是为了校准相机,拍摄15张不同的照片以及最后一张带有棋盘的照片,但没有圆圈。这样我就可以使用最后一张图像的旋转和平移向量。http://postimg.org/image/cclyvn8tv/ - user3417020
我将根据Q(物理地面平面上的点) = H.inv() * q(图像点)或者根据您的评论,使用Q = R.t() * (C.inv() * q - T)来将像素坐标转换为地面平面上的物理坐标。通过这种方式,我想找到圆心的物理坐标,而不是棋盘的原点。我假设棋盘只用于找到内参和外参(当棋盘放在地面上时)。否则,如果我不能将图像平面上的任意像素转换为物体(地面)平面上的坐标,那么棋盘有什么用呢? - user3417020
感谢您的评论,我无法理解加速度计方法。然而,通过物理和图像平面之间的透视投影概念,我解决了我的问题。现在我可以准确估算每个像素在图像上的物理坐标。谢谢。 - user3417020
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接