使用OpenCV3.4执行双目相机标定遇cv2.stereoCalibrate参数错误求助
双目标定时
cv::collectCalibrationData报错的原因分析 你在完成单相机标定后调用stereoCalibrate时遇到的这个错误,核心是OpenCV在收集标定数据时,发现传入的参数不满足必要的匹配条件。先把你遇到的错误信息和代码整理清楚:
报错信息
in <module> criteria = termination_criteria_extrinsics error: C:\projects\opencv-python\opencv\modules\calib3d\src\calibration.cpp:3083: error: (-215) nimages > 0 && nimages == (int)imagePoints1.total() && (!imgPtMat2 || nimages == (int)imagePoints2.total()) in function cv::collectCalibrationData
你的调用代码
termination_criteria_extrinsics = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 1e-5) ret, mtx, dist, mtx2, dist2, R, T, E, F = cv2.stereoCalibrate( objpoints_l, imgpoints_l, imgpoints_r, mtxL, distL, mtxR, distR, gray_l.shape[::-1], flags = flags, criteria = termination_criteria_extrinsics )
接下来针对错误提示里的三个核心条件,逐一分析可能的问题:
nimages > 0不满足
说明传入的有效标定图像数量为0,大概率是objpoints_l、imgpoints_l其中一个是空列表。你可以先打印len(objpoints_l)和len(imgpoints_l),如果结果是0,那就是单目标定时没有正确收集到3D目标点或2D图像角点数据。nimages == (int)imagePoints1.total()不满足nimages是你传入的标定图像总数(也就是objpoints_l的长度),imagePoints1.total()是左相机所有图像角点的总数。如果这两个数值不匹配,要么是imgpoints_l的格式错了——比如你把所有图像的角点合并成了一个大数组,而非每个元素对应单张图的角点矩阵;要么是某张图的角点收集失败但没被过滤,导致总数对不上。nimages == (int)imagePoints2.total()不满足
这个条件要求左右相机的标定图像数量必须完全匹配。比如你左相机用了25张图收集角点,但右相机只成功收集了23张,就会触发这个错误。要确保每一张左图都对应一张右图,imgpoints_l和imgpoints_r的长度必须完全一致,且每张对应的图都成功采集到了角点。
快速排查步骤
- 打印三个关键长度:
print(len(objpoints_l), len(imgpoints_l), len(imgpoints_r)),确保三个数值完全相等且大于0; - 检查
imgpoints_l和imgpoints_r里的每个元素,确认都是对应单张图像的角点数组(比如每个元素是(N,2)的numpy数组,N是该图的角点数量); - 确认
gray_l.shape[::-1]的尺寸和你采集标定图像时的尺寸一致,不要传入错误的图像尺寸。
内容的提问来源于stack exchange,提问作者gaetano ma
相关产品推荐
相关产品推荐

