创建带自定义ID的Charuco Board时出现段错误求助
自定义ID Charuco Board段错误问题解决(OpenCV 4.11.0)
问题描述
使用默认参数初始化自定义Charuco Board对象时,创建self.board环节触发段错误,代码中已校验标记ID数量在字典范围内,但仍出现崩溃。
问题原因
段错误源于OpenCV后端内存访问异常,核心是传递给CharucoBoard构造函数的marker_ids数组不符合接口要求:
- numpy生成的数组可能是非连续内存布局(C-order),OpenCV的C++接口无法正确处理
- 二维数组的维度或顺序匹配存在隐性问题
修复方案
方案1:强制生成连续数组
修改marker_ids生成代码,在reshape后添加.copy()确保数组内存连续:
marker_ids = np.arange(start_id, start_id + num_markers, dtype=np.int32).reshape(num_markers_y, num_markers_x).copy()
方案2:改用一维ID数组
直接传递一维ID序列,让OpenCV按默认顺序(左到右、上到下)分配标记ID:
# 生成一维ID序列,无需reshape为二维 marker_ids = np.arange(start_id, start_id + num_markers, dtype=np.int32)
方案3:显式转换为cv2.Mat类型
将numpy数组转换为OpenCV原生Mat类型,避免跨类型转换异常:
marker_ids = np.arange(start_id, start_id + num_markers, dtype=np.int32).reshape(num_markers_y, num_markers_x) marker_ids_mat = cv2.Mat(marker_ids) self.board = cv2.aruco.CharucoBoard( (self.squaresX, self.squaresY), self.squareLength, self.markerLength, self.aruco_dict, marker_ids_mat )
验证方式
可添加以下代码确认数组是否为连续内存布局,输出True则符合要求:
print(marker_ids.flags['C_CONTIGUOUS'])
内容的提问来源于stack exchange,提问作者Tommy Llewellyn
相关产品推荐
相关产品推荐

