Python进行270°相机标定调用cv2.cornerSubPix报(-215)断言错误如何解决
cv2.cornerSubPix断言错误(count >= 0)修复方案
报错根因
该错误本质是你传入cv2.cornerSubPix的角点数组corners为空,触发了OpenCV的参数合法性校验,完全是代码逻辑写反导致的:
cv2.findChessboardCorners的返回值ret为True时,才代表成功识别到棋盘格、corners变量存储了有效的角点坐标- 你的代码写了
if ret != True,相当于只有识别不到棋盘格的时候才调用cornerSubPix,此时corners是空值,直接触发断言
其他代码问题
除了核心的判断逻辑错误外,你的代码还有两处明显问题:
- 变量未定义:你用
glob读取图片路径存入了images变量,但读取图片时直接用了未定义的fname,会直接触发变量不存在的报错 - 标定样本不足:相机标定至少需要10~20张不同角度、不同位置的棋盘格图片才能得到可用的参数,你当前代码只读取了1张图片,后续标定步骤也会报错
修复后可运行代码
import cv2 import numpy as np import glob # 定义棋盘格内角点尺寸(注意是黑白格交叉点的数量,不是棋盘格的格子数) CHECKERBOARD = (6,9) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # 存储3D世界坐标点、2D图像坐标点 objpoints = [] imgpoints = [] # 生成棋盘格3D坐标模板 objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32) objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2) # 读取所有标定图片,建议把所有标定图片放到/home/pi/Desktop/calib_images/目录下,后缀统一为jpg images = glob.glob('/home/pi/Desktop/calib_images/*.jpg') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 检测棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE) # 只有检测到角点的时候才执行后续逻辑 if ret == True: objpoints.append(objp) # 亚像素优化角点坐标 corners2 = cv2.cornerSubPix(gray, corners, (3,3),(-1,-1), criteria) imgpoints.append(corners2) # 绘制角点并展示 img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret) cv2.imshow('Chessboard Corners',img) cv2.waitKey(500) cv2.destroyAllWindows() # 执行标定 h,w = gray.shape[:2] ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (w,h), None, None) # 可输出标定结果验证 print("内参矩阵:\n", mtx) print("畸变系数:\n", dist)
额外注意事项
- 先确认你用的棋盘格内角点数量是不是6*9,如果数错了也会导致
findChessboardCorners返回失败 - 270°鱼眼相机畸变较大,建议用
cv2.fisheye模块的专用标定接口,精度会比普通标定接口高很多
内容的提问来源于stack exchange,提问作者Maryam Moradi
相关产品推荐
相关产品推荐

