ROS项目Python转C++:OpenCV findHomography断言失败问题
ROS机器人校准C++代码findHomography断言失败排查
错误核心原因
报错(-215:Assertion failed) src.checkVector(2) == dst.checkVector(2)直接说明:输入的源点集与目标点集不满足「点数相等且均为2维坐标」的要求。
具体排查方向
1. 验证点集数量一致性
- 对比Python与C++代码读取
calibration.json后,src_points和dst_points的元素数量是否完全一致。 - 检查C的JSON解析逻辑:确保从JSON的
src和dst字段中读取到的点是一一对应的,没有漏读、重复读取或解析错误(比如JSON结构中某组点格式异常,导致C解析时跳过该点)。
2. 检查点的维度与数据类型
- OpenCV要求输入点为2维浮点型:
- 若用
std::vector<cv::Point2f>存储点,需确保每个Point2f的x和y都被正确赋值,无未初始化的无效点; - 若用
cv::Mat存储,需保证Mat的通道数为2、行数等于点数、数据类型为CV_32F或CV_64F。
- 若用
- 对比Python代码的点处理逻辑:Python中
np.array(src_points, dtype=np.float32)会自动统一类型和维度,C++需手动复刻该逻辑,避免出现3维点(如误将z坐标传入)或整数类型点。
3. 核对坐标处理逻辑
- 检查C++中估算参数
l和L后的坐标变换代码,是否完全复刻了Python版本的逻辑:- 若存在坐标缩放、偏移等操作,需确保操作后点集的点数未被改变,且每个点的x/y坐标均被正确计算。
- 避免出现因逻辑错误导致某一个点集被意外截断或扩充的情况。
4. 验证findHomography参数传递
- C++中调用
cv::findHomography时:- 若传入
std::vector<cv::Point2f>,需保证两个vector的size()完全相等; - 若传入
cv::Mat,需保证两个Mat的rows相同,且cols=1、channels=2。
- 若传入
常见错误示例
- JSON解析时误将
src的点混入dst集合,导致两个点集点数不匹配; - 某组点的y坐标未被正确读取,导致
Point2f的y值为随机无效值,触发维度检查失败; - 错误使用
cv::Point(整数类型)而非cv::Point2f(浮点类型)存储点,导致数据类型不兼容。
内容的提问来源于stack exchange,提问作者caesar753
相关产品推荐
相关产品推荐

