为什么OpenCV认为我使用的是非平面校准装置?

2024-06-01 03:57:57 发布

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

我正在玩一个模拟的相机装备来尝试理解OpenCV的calib3d模块是如何工作和执行的。在

我在3D空间中创建了一组人造对象点,对应于z=50处由9个点组成的平面网格:

obj_pts = np.zeros((9, 3), dtype='float32')
obj_pts[0] = np.array([40, 40, 50], dtype='float32')
obj_pts[1] = np.array([50, 40, 50], dtype='float32')
obj_pts[2] = np.array([60, 40, 50], dtype='float32')
obj_pts[3] = np.array([40, 50, 50], dtype='float32')
obj_pts[4] = np.array([50, 50, 50], dtype='float32')
obj_pts[5] = np.array([60, 50, 50], dtype='float32')
obj_pts[6] = np.array([40, 60, 50], dtype='float32')
obj_pts[7] = np.array([50, 60, 50], dtype='float32')
obj_pts[8] = np.array([60, 60, 50], dtype='float32')

在创建了一个人造相机之后,我使用cv2.projectPoints()对其进行了成像:

^{pr2}$

使用上述参数投影到图像平面,图像点如下所示(红色点表示方向的左下角):

Plot of the artificial image points projected into image plane

最后,我试图恢复原始摄像机校准:

obj_pts_list = [obj_pts]
img_pts_list = [img_pts]
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_pts_list, img_pts_list, (200, 200), None, None)

但是,最后一步会出现以下错误:

OpenCV Error: Bad argument (For non-planar calibration rigs the initial intrinsic matrix must be specified) in cvCalibrateCamera2, file /tmp/opencv20150527-4924-hjrvz/opencv-2.4.11/modules/calib3d/src/calibration.cpp, line 1592

我的问题不是如何修复这个错误本身,而是为什么首先抛出它?为什么当所有对象点都位于同一平面上时,这个设置会构成一个非平面装备?我误解了吗?在


Tags: 对象objimgnparraycv2opencv平面
1条回答
网友
1楼 · 发布于 2024-06-01 03:57:57

OpenCV期望z = 0,因为它是平面校准目标的情况。在

查看代码,OpenCV检查该值如下:

Scalar mean, sdv;
meanStdDev(matM, mean, sdv);
if( fabs(mean[2]) > 1e-5 || fabs(sdv[2]) > 1e-5 )
        CV_Error( CV_StsBadArg,
"For non-planar calibration rigs the initial intrinsic matrix must be specified" );

这意味着设置z而不是0会触发错误。除非使用非平面校准目标,否则必须使用z = 0。在

相关问题 更多 >