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
相关产品推荐
相关产品推荐

