为何cv2.projectPoints返回的某一投影点坐标完全错误?
单个投影点坐标完全错误的solvePnP验证问题
我在项目中使用cv2.solvePnP求解位姿,为验证返回的旋转向量与平移向量准确性,调用cv2.projectPoints对目标点做投影,结果发现除一个点外,其余投影点坐标基本准确。相关图表如下:
- [目标坐标系中的点图片]
- [图像坐标系中的点及主点图片]
- [目标点投影至图像坐标系的图片,最左侧点坐标与其他图像点完全不符]
代码逻辑与参数
相机内参与畸变系数
读取的相机矩阵与畸变系数如下:
mtx = array([[3.44866714e+03, 0.00000000e+00, 1.07421856e+03], [0.00000000e+00, 3.44458531e+03, 2.30517222e+03], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) dist = array([[ 1.51441764e-01, -1.49096039e+00, -8.53533932e-04, -2.23953318e-04, 5.62777824e+00]])
solvePnP调用
retval, orvec, otvec = cv2.solvePnP(obj_pts, img_pts, mtx, dist, flags=cv.SOLVEPNP_P3P)
投影验证
img_pts_bis, _ = cv.projectPoints(obj_pts, orvec, otvec, mtx, dist)
点提取与坐标适配逻辑
点提取自添加黑点标记兴趣点的棋盘格图片,通过阈值化提取,代码如下:
img = color.rgb2gray(img) shape = img.shape thresh = 0.02 img = (img < thresh) img = np.float32(img) pts_coord = np.where(img==1.0) t = (pts_coord[0].shape)[0] img_pts = [] # 提取点过多,仅保留4个 for i in range (t): if len(img_pts) < 4 : if not img_pts : img_pts.append( [ pts_coord[1][i], pts_coord[0][i] ] ) else : # 仅保留间距足够大的点 if np.abs( pts_coord[0][i] - img_pts[-1][1]) > 30 : img_pts.append( [pts_coord[1][i], pts_coord[0][i]] ) img_pts = np.array(img_pts)
调整坐标以适配图像坐标轴方向:
for e in img_pts : e[1] = shape[0] - e[1]
目标点坐标:
obj_pts = np.array([[1, 1, 0], [0, 5, 0], [3, 3, 0], [4, 1, 0] ])
仅单个投影点完全错误的情况很异常,我刚熟悉这些函数,怀疑存在使用或理解上的误区。
内容的提问来源于stack exchange,提问作者prince_B612
相关产品推荐
相关产品推荐

