C++使用OpenCV调整图像大小时触发Segmentation Fault问题求助
问题排查与解决方法
- 第一步:添加图像读取有效性校验
绝大多数resize操作段错误都是读取到空Mat触发的,哪怕你认为可以正常展示图像,也先在imread后添加校验代码:
Mat image = imread("./test_image.jpg"); // 新增校验逻辑 if (image.empty()) { std::cerr << "图像读取失败,请检查文件路径、当前工作目录是否正确" << std::endl; return -1; }
如果运行后提示读取失败,调整图像路径即可解决问题。
- 第二步:检查编译链接配置是否正确
Ubuntu环境下非常容易出现多版本OpenCV冲突的问题:如果你自行编译安装了OpenCV 4.5.4,同时系统还存在通过apt安装的旧版OpenCV,编译时头文件用了4.5.4版本,链接时却链接到旧版库,ABI不兼容就会触发resize等函数的段错误。- 编译时必须使用对应版本的编译参数:OpenCV 4.x版本的pkg-config名称为
opencv4,不要使用旧版的opencv,示例编译命令:
g++ your_code.cpp -o test `pkg-config --cflags --libs opencv4`- 确认链接的库版本正确:执行
ldd ./test查看可执行文件链接的所有OpenCV相关动态库路径,确认路径指向你安装的4.5.4版本的库目录,而不是系统默认的/usr/lib/x86_64-linux-gnu/下的旧版库。
- 编译时必须使用对应版本的编译参数:OpenCV 4.x版本的pkg-config名称为
- 第三步:修复多版本冲突
如果确认是多版本冲突导致的问题,两种解决方案任选其一:- 卸载系统自带的旧版OpenCV:执行
sudo apt remove libopencv*清除所有apt安装的OpenCV相关包,之后重新编译你的代码即可。 - 编译时手动指定OpenCV路径:如果需要保留旧版,用CMake编译时在CMakeLists.txt中添加
set(OpenCV_DIR "你的OpenCV4.5.4安装路径/lib/cmake/opencv4");用g++直接编译时在命令中添加库路径指定,例如:
g++ your_code.cpp -o test -I/你的安装路径/include/opencv4 -L/你的安装路径/lib -Wl,-rpath=/你的安装路径/lib `pkg-config --cflags --libs opencv4` - 卸载系统自带的旧版OpenCV:执行
- 可选验证:指定resize插值参数
如果以上步骤都确认无误,可以手动指定resize的插值参数排除参数异常问题,修改resize代码为:
cv::resize(image, dst, cv::Size(150,150), 0, 0, cv::INTER_LINEAR);
内容的提问来源于stack exchange,提问作者Anuj
相关产品推荐
相关产品推荐

