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

OpenCV C++调用absdiff()计算帧差出现未处理异常如何解决?

问题原因及解决步骤

你触发cv::Exception的核心原因是代码没有对输入数据做合法性校验,也没有对齐两个输入矩阵的参数,absdiff()要求两个输入Mat的尺寸、通道数、数据类型完全一致,只要有一个条件不满足就会抛出异常,你遗漏了以下必要步骤:

  • 摄像头设备打开校验:调用VideoCapture初始化后没有判断是否成功打开摄像头,设备不存在、无权限调用摄像头时,后续读帧操作会得到空Mat,触发异常
  • 资源读取结果校验:没有判断静态图片是否读取成功、摄像头帧是否读取成功,图片路径错误、摄像头读帧失败都会得到空Mat,后续处理直接报错
  • 输入矩阵参数对齐:没有校验静态图片和摄像头采集帧的分辨率、通道数是否匹配,两者参数不一致时absdiff()会直接抛出异常
  • 异常捕获逻辑:没有添加OpenCV异常捕获逻辑,无法定位具体报错原因

修正后可运行代码

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main() {
    try {
        VideoCapture webcam(0);
        // 校验摄像头是否成功打开
        if (!webcam.isOpened()) {
            cerr << "无法打开摄像头设备" << endl;
            return -1;
        }

        Mat img, web, diff;
        // 校验摄像头读帧是否成功
        if (!webcam.read(web)) {
            cerr << "读取摄像头帧失败" << endl;
            return -1;
        }
        // 校验静态图片读取是否成功
        img = imread("/Users/dnxv2/Desktop/test.jpg");
        if (img.empty()) {
            cerr << "静态图片读取失败,请检查路径是否正确" << endl;
            return -1;
        }

        // 对齐两个输入的分辨率,把静态图resize到和摄像头帧一致
        resize(img, img, web.size());
        // 转灰度
        cvtColor(web, web, COLOR_BGR2GRAY);
        cvtColor(img, img, COLOR_BGR2GRAY);

        absdiff(img, web, diff);
        
        imshow("帧差结果", diff);
        waitKey(0);
    } catch (const cv::Exception& e) {
        cerr << "OpenCV报错信息:" << e.what() << endl;
        return -1;
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Jack Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:01