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

Linux下OpenCV C++程序触发Segmentation fault (core dumped)问题排查

问题原因分析与解决方案

核心问题1:手动创建目标Mat引发内存访问错误

你手动初始化img_grayscale和img_gaussian的方式会导致内存布局不匹配:

cv::Mat img_grayscale(img.rows, img.cols, CV_8U);
cv::Mat img_gaussian(img.rows, img.cols, CV_8U);

OpenCV的cvtColor、GaussianBlur这类函数会根据输入图像的内存特性(比如内存步长/stride、对齐规则)自动分配适配的输出内存。手动指定尺寸和类型创建的Mat,其内存布局大概率和输入图像不兼容,导致函数在写入数据时越界访问,触发段错误。

核心问题2:图像有效性检查不严谨

用img.data == NULL判断图像是否加载成功并不严谨,OpenCV官方推荐使用img.empty()——部分场景下图像对象存在但数据无效时,data指针可能不为空,但empty()会准确返回true。

修复后的代码

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv) {
    if(argc < 2) {
        std::cout << "Error: insert the image name! \n";
        return 0;
    }
    cv::Mat img = cv::imread(argv[1]);
    if(img.empty()) { // 改用标准的empty()检查
        std::cout << "Error: wrong name! \n";
        return 0;
    }
    cv::Mat img_grayscale; // 不手动初始化,让cvtColor自动创建适配的Mat
    cv::cvtColor(img, img_grayscale, cv::COLOR_BGR2GRAY);

    cv::Mat img_gaussian; // 让GaussianBlur自动分配符合要求的内存
    cv::GaussianBlur(img_grayscale, img_gaussian, cv::Size(5, 5), 0, 0, cv::BORDER_DEFAULT);
    cv::imshow("image gaussian filter", img_gaussian); // 修正显示对象为处理后的图像
    cv::waitKey(0);
    return 0; // 补充标准返回值
}

额外说明

你的编译命令无需修改,只要确保OpenCV头文件与库版本一致即可(当前参数适配4.x版本是正确的)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:37:46