我在互联网上搜索了很多资源,但是多日来都没有解决问题。
我有一个项目需要检测平面上圆形物体的位置。由于在平面上,我只需要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对对应的共面点生成变换)进行了很好的估计。然后简单地将变换应用于图像像素点。