ROS环境下使用OpenCV LK光流算法触发core dumped错误如何修复
报错原因
该报错本质是所有跟踪特征点丢失后,calcOpticalFlowPyrLK函数接收的上一帧特征点数组p0为空,OpenCV内部参数校验不通过,抛出未捕获异常导致程序崩溃。
修复方案
只需要在调用光流计算前增加特征点数量校验逻辑,有效特征点不足时自动重新检测新的特征点即可,无需中断程序运行,还可搭配异常捕获做双重保障。
核心修改点
在原代码光流计算段前新增如下逻辑:
const int MIN_TRACK_POINTS = 10; // 最小保留跟踪点阈值,可根据需求调整 // 跟踪点不足时重新检测角点 if (p0.size() < MIN_TRACK_POINTS) { goodFeaturesToTrack(old_gray, p0, 100, 0.3, 7, Mat(), 7, false, 0.04); mask = Mat::zeros(frame.size(), frame.type()); // 不需要保留历史轨迹可添加本行,不需要可删除 } // 可选:添加异常捕获,极端情况下也不会崩溃 try { // 原有光流计算逻辑放到try块内 vector<uchar> status; vector<float> err; TermCriteria criteria = TermCriteria((TermCriteria::COUNT) + (TermCriteria::EPS), 10, 0.03); calcOpticalFlowPyrLK(old_gray, frame_gray, p0, p1, status, err, Size(15,15), 2, criteria); } catch (const cv::Exception& e) { ROS_WARN("光流计算异常:%s,跳过当前帧", e.what()); p0.clear(); ros::spinOnce(); continue; }
逻辑说明
- 每次循环先检查当前剩余有效跟踪点数量,低于阈值时自动调用
goodFeaturesToTrack生成新的跟踪点,光流计算可自动恢复 - 异常捕获逻辑可以避免参数错误、空帧等极端情况导致的程序崩溃,只会输出警告后继续运行
内容的提问来源于stack exchange,提问作者SantoshRimu
相关产品推荐
相关产品推荐

