关于相机标定焦距、rvec/tvec选型及目标距离与世界坐标估算的技术问询
相机标定与距离/坐标估算问题解答
我使用棋盘格完成了PoE相机的标定,计划通过焦距估算已知实际尺寸目标与相机的距离。标定输出结果如下:
Camera Calibration: 1.7443757332593848 Camera Matrix: [[1.60769726e+03 0.00000000e+00 9.52018792e+02] [0.00000000e+00 1.60665029e+03 2.92296761e+02] [0.00000000e+00 0.00000000e+00 1.00000000e+00]] Distortion Parameters: [[-0.21606616 -0.63180433 -0.00325319 0.00222699 1.98712916]] Rotation Vectors: (array([[ 0.07224807], [-0.50125655], [-0.1803044 ]]), array([[ 0.09261887], [ 0.06385082], [-0.00816447]]), array([[ 0.08968368], [ 0.05769877], [-0.01871089]]), array([[9.03344928e-02], [1.21236810e-01], [2.69416301e-05]]), array([[0.11183268], [0.29111005], [0.03007957]]), array([[0.11217145], [0.42133195], [0.02784451]]), array([[0.14417592], [0.53619098], [0.04125443]]), array([[0.16017898], [0.67775563], [0.04417317]]), array([[ 0.04416578], [-0.02285857], [-0.01705777]]), array([[ 0.09415478], [-0.13700963], [-0.02052559]]), array([[ 0.09660401], [-0.27047429], [-0.02057789]]), array([[ 0.1023921 ], [-0.23873025], [-0.03277892]]), array([[ 0.10150192], [-0.35322471], [-0.07257268]]), array([[ 0.09091438], [-0.40158596], [-0.10816352]]), array([[ 0.06015935], [-0.50295236], [-0.12777835]])) Translation Vectors: (array([[-0.0609731 ], [ 0.00573651], [ 0.39862613]]), array([[-0.1255173 ], [-0.00786904], [ 0.35559186]]), array([[-0.12519083], [-0.00685334], [ 0.353846 ]]), array([[-0.12417797], [-0.0180632 ], [ 0.41538341]]), array([[-0.10585784], [-0.01815088], [ 0.40054014]]), array([[-0.10077983], [-0.02083386], [ 0.40778494]]), array([[-0.1035432], [-0.020356 ], [ 0.4242453]]), array([[-0.10760302], [-0.03312439], [ 0.45943657]]), array([[-0.13239241], [-0.00820463], [ 0.33685892]]), array([[-0.11440255], [-0.00992325], [ 0.34370701]]), array([[-0.10157535], [-0.03602992], [ 0.32223598]]), array([[-0.12930068], [-0.00939119], [ 0.33570583]]), array([[-0.11115253], [-0.0047846 ], [ 0.30802406]]), array([[-0.14004492], [ 0.00104571], [ 0.33794211]]), array([[-0.05227404], [-0.01433328], [ 0.29691116]]))

我还通过公式 focal_length = (actual_distance * image_object_height) / actual_object_height 计算焦距,结果在1250-1400之间,和标定得到的焦距差异较大,现提出以下技术问题:
问题1:估算已知实际尺寸的目标与相机之间的距离时,应选用哪个焦距?
- 必须选用相机标定得到的焦距:相机矩阵中的
1.60769726e+03(x轴方向)和1.60665029e+03(y轴方向),这是通过多组棋盘格图像计算出的最优内参,精度远高于单张图的估算结果。 - 单张图计算焦距误差大的原因:实际距离、图像中目标高度的手动测量容易存在误差,且该公式未考虑镜头畸变的影响,而标定过程已经消除了畸变带来的系统误差。
- 正确距离估算流程:先使用标定得到的畸变参数对图像做畸变校正,再用校正后图像中目标的像素尺寸,结合标定焦距和实际尺寸计算距离,公式调整为:
distance = (actual_object_height * focal_length) / corrected_image_object_height
问题2:估算目标的世界坐标时,应使用相机标定得到的哪一组rvec和tvec,还是对直播流的每一帧使用cv2.solvePnP计算rvec和tvec?
- 标定得到的多组rvec和tvec仅对应标定过程中每张棋盘格图像相对于相机的位姿,仅适用于当时的棋盘格场景,不能直接用于目标物体的位姿计算。
- 正确做法:对直播流的每一帧图像,使用
cv2.solvePnP计算目标的rvec和tvec。前提是你能在图像中识别出目标的至少4个已知世界坐标的特征点(比如目标的四个角,提前定义好它们的世界坐标),结合标定好的相机内参和畸变参数,解算出当前帧中目标相对于相机的位姿,进而推导目标的世界坐标。
内容的提问来源于stack exchange,提问作者Alan Lee
相关产品推荐
相关产品推荐

