恢复姿势OpenCV 3.0

恢复姿势OpenCV 3.0,opencv,computer-vision,Opencv,Computer Vision,我用opencv 3.0校准了针孔相机,得到了4个内在参数(f_x,f_y,u_0,v_0)和一些失真系数。通过这种校准,我从两幅不同位置的图像中估计出基本矩阵。最后,我想使用opencv3.0中的recoverpose函数恢复(R | t)。这个函数的接口需要一个单焦距,但我在校准程序中有两个焦距。如何从f_x和f_y中获得焦距f=f_y/s_y=f_x/s_x(根据OpenCV的定义),以便我可以正确使用恢复姿势功能?你不能仅仅从f_x和f_y获得实际焦距。对于针孔相机,实际焦距是针孔到成像

我用opencv 3.0校准了针孔相机,得到了4个内在参数(f_x,f_y,u_0,v_0)和一些失真系数。通过这种校准,我从两幅不同位置的图像中估计出基本矩阵。最后,我想使用opencv3.0中的recoverpose函数恢复(R | t)。这个函数的接口需要一个单焦距,但我在校准程序中有两个焦距。如何从f_x和f_y中获得焦距f=f_y/s_y=f_x/s_x(根据OpenCV的定义),以便我可以正确使用恢复姿势功能?

你不能仅仅从f_x和f_y获得实际焦距。对于针孔相机,实际焦距是针孔到成像平面的距离。您的相机的焦距可能写在规格中的某个地方。

您可以简单地使用水平焦距f\u x。比率f_y/f_x只是像素纵横比,它是对像素平方度的估计


请注意,除非您的图像对中有一些绝对比例参考(例如,已知大小的对象),否则您只能恢复最大比例的姿势,即对于一些未知比例s的R和s*t。

CalibleCamera返回的f_x以像素为单位。recoverPose()函数需要以毫米为单位的焦距。因此,有必要对其进行转换。这可以做到,如果你知道你的CMOS传感器的大小。或者,使用相机/镜头制造商公布的焦距(单位:mm)。@Derec Simkowiak,这里有几个错误:(1)f_x和f_y的单位是像素/长度,其中长度是以校准对象的单位测量的,例如,在通常的OpenCV设置中,棋盘格的宽度。(2) 更正确的说法是,recoverPose()以与给定焦距相同的单位返回平移,可以是像素、毫米、英寸或公里。正如您所说,绝对刻度可以从传感器的知识中获得,但如果已知校准装置的几何结构,也可以从校准过程中恢复。进一步读取后,recoverPose()不期望焦距以毫米为单位,尽管文档中未明确这一点。相比之下,calibrationMatrixValues()的文档中说它需要mm@Francesco,re:你的观点(2),我的理解是,返回的平移是一个单位向量,表示平移的方向,而不是距离。这与t有点不同,t是一些任意单位的绝对平移(例如棋盘格平方单位)。我很想阅读有关这一主题的任何参考资料,特别是如何将t转换为绝对单位。通过实验,我确认recoverPose()总是返回单位向量进行转换。所以,它给出了方向,但不是距离。