码Monkey 2021-03-10 22:08 采纳率: 0%
浏览 86
已结题

已知四对匹配点,3D、2D坐标已知,求相机位置,x轴偏差大,为什么?

 

当前我有4对匹配点,图像特征的2D位置以及其对应的3D位置都有,我也标定了相机,获得了相机内参和畸变参数,然后我是用python 里面的 cv2.solvePnP(),方法选择AP3P,因为这个方法所需的特征点最少。求得R、T之后,我在利用 `-R.int()*t`获得相机在世界坐标系的位置。不过我现在有个问题,就是获得的结果中,x轴的偏差很大,有几十厘米的误差,然而y轴只有几厘米的误差,为什么?

下面是我的测试代码,求大佬解答。

import cv2
import numpy as np

# unit mm
IntrinsicMatrix = np.array ([[5816.91523, 0., 2634.55839],
                             [0., 5787.34531, 3687.93429],
                             [0., 0., 1.]])
# unit mm
distCoeffs = np.array ([0.0597, -0.0416, 0.005, -0.0058,0.])

# unit cm
Points3D[0, 0,:] = -7.0, 7.0, 0.0
Points3D[1, 0,:] = 7.0, 7.0, 0.0
Points3D[2, 0,:] = 7.0, -7.0, 0.0
Points3D[3, 0,:] = -7.0, -7.0, 0.0

# unit cm
Points2D[0,0,:] = 2365.,3668.
Points2D[1,0,:] = 2766.,3671.
Points2D[2,0,:] = 2771.,3261.
Points2D[3,0,:] = 2364.,3258.

found, rvecs, tvecs = cv2.solvePnP(objectPoints=Points3D,
                                         imagePoints=Points2D,
                                         cameraMatrix=IntrinsicMatrix,
                                         distCoeffs=distCoeffs,
                                         flags=cv2.SOLVEPNP_AP3P
                                         )
if found:
     R,_ = cv2.Rodrigues(rvecs)
     if np.linalg.matrix_rank(R) == 3:
         position_result = -np.linalg.inv(R).dot(tvecs)

我的结果如下:

# unit cm
position : 
 [[ -39.0898995 ]
 [   2.77867074]
 [-192.27239882]]

我用相机正对着图片拍摄,保持水平(图片出现在相机中央)。我以图片为中心为世界坐标系(坐标系平行于相机的XOY)的原点,3D四点分别顺序是参考cv2.solovePnP的解释 

.     - point 0: [-squareLength / 2,  squareLength / 2, 0]
.     - point 1: [ squareLength / 2,  squareLength / 2, 0]
.     - point 2: [ squareLength / 2, -squareLength / 2, 0]
.     - point 3: [-squareLength / 2, -squareLength / 2, 0]

。理论上来说,结果应该为[0,0,0]左右,为什么x轴有这么大的误差?

 

  • 写回答

3条回答 默认 最新

  • 码Monkey 2021-03-10 22:19
    关注

    我使用一张模板图和一种相机拍摄的图像,进行匹配得到。世界坐标系是我假设的,不知道这样对不对

    评论

报告相同问题?

悬赏问题

  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题