使用“打开”的相机暂停功能时出现意外结果

2024-10-01 15:47:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python2.7中使用Opencv。

我用棋盘获得了相机的内在矩阵和相机停顿的外部矩阵:

(ret, mtx, dist, rvecs, tvecs) = cv2.calibrateCamera(objpoints, imgpoints, grayImg.shape[::-1],None,None)

[ret, rvec, tvec] = cv2.solvePnP(objp, corners, mtx, distCoeff)

然后,我用简历投影点

^{pr2}$

到目前为止,一切正常:世界坐标轴在图像上以三维形式出现,原点位于棋盘的一角,两个轴平行于棋盘的侧面,第三个轴随后与此正交。

我还将rvec向量转换为旋转矩阵:

^{3}$

现在,我想可视化摄影机轴在图像上的投影;更准确地说,我要绘制在摄影机轴系统中坐标为[1,0,1]、[0,1,1]和[0,0,1]的点的投影。

通常:我应该观察一个直角三角形,它的两个正交边与图像的边平行,因为相机坐标轴是这样定义的。

根据我所读到的所有内容,世界坐标和相机坐标是由X_cam=Rmat*X_world+tvec关联的,因此X_world=Rmat^-1(X_cam-tvec)。因此,下面的代码应该显示一个直角三角形,角可能位于图像中心附近:

cam_axes = chess_board_square_sz * np.float32([1,0,1], [0,1,1], [0,0,1]);
world_cam_axes = n.dot(Rmat.T, (cam_axes - tvec))  
[proj_cam_axes, jac] = cv2.projectPoints(world_cam_axes, rvec, tvec, mtx, dist)

img = cv2.imread(calibr_img_name)
img = cv2.line(img, tuple(rproj_cam_axes[0].ravel(), tuple(rproj_cam_axes[1].ravel()), [255,0,0], 5)
img = cv2.line(img, tuple(rproj_cam_axes[0].ravel(), tuple(rproj_cam_axes[2].ravel()), [0,255,0], 5)
img = cv2.line(img, tuple(rproj_cam_axes[1].ravel(), tuple(rproj_cam_axes[2].ravel()), [0,0,255], 5)
fig, ax2 = plt.subplot(1)
ax2.imshow(img2, interpolation = 'bicubic')

但图像上显示的内容与直角三角形(即使三角形的一个角靠近图像中心)有很大不同。
有人能解释一下这里发生了什么吗?


Tags: 图像imgworld棋盘矩阵cv2投影cam
1条回答
网友
1楼 · 发布于 2024-10-01 15:47:00

这只是一个输入参数的问题简历投影点:这应该是

[项目凸轮轴,jac]=cv2.投影点(world_cam_axes.T,rvec,tvec,mtx,distcoefs)

为了将世界凸轮轴矩阵转换为对象点(用opencv的话来说)

相关问题 更多 >

    热门问题