You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:18:02