【问题标题】:EXC_BAD_ACCESS error OpenCV?EXC_BAD_ACCESS 错误 OpenCV?
【发布时间】:2016-12-23 12:56:40
【问题描述】:

我正在尝试在 OpenCV 中编写用于图像分割的代码。作为图像处理的一部分,我正在尝试使用 Sobel 滤波器检测测试图像的边缘。

为了找到 dXdY 方向上的梯度大小,我正在计算两个梯度的欧几里得距离。但是当我运行代码时,我得到了上述错误。我知道当我尝试“访问”内存中不可用的位置时会发生上述错误,但我确信我已经在我的代码中定义了所有Mat

这是我的代码的一部分。

//Blur the raw image to remove noise
GaussianBlur(src, src, kernel, 2);

//Run sobel edge detector
Sobel(src, edgeX, src.depth(), 1, 0);
Sobel(src, edgeY, src.depth(), 0, 1);

edge = Mat::zeros(317,554,CV_8UC1);

for (int r = 0; r < edgeX.rows; r++)
{
    for (int c = 0; c < edgeY.cols; c++)
    {
        edge.at<double>(r,c) = sqrt((edgeX.at<double>(r,c)*edgeX.at<double>(r,c)) + (edgeY.at<double>(r,c)*edgeY.at<double>(r,c)));
    }
}

地点:

  • src: RGB 测试图
  • edgeX: 带有 dX 梯度的 sobel 输出
  • edgeY: 带有 dY
  • 的 sobel 输出
  • edge: 是欧几里得距离的Mat

我在这一行得到错误

edge.at<double>(r,c) = sqrt((edgeX.at<double>(r,c)*edgeX.at<double>(r,c)) + (edgeY.at<double>(r,c)*edgeY.at<double>(r,c)));

尝试访问edge.at&lt;double&gt;(316,395)

我该如何调试呢? 我做错了什么?

【问题讨论】:

    标签: c++ opencv debugging pointers


    【解决方案1】:

    edgeCV_8UC1 类型的矩阵,表示uchar 的矩阵,而不是double 的矩阵。

    您需要使用at&lt;uchar&gt;访问它:

     edge.at<uchar>(r,c) = sqrt((edgeX.at<uchar>(r,c)*edgeX.at<uchar>(r,c)) + (edgeY.at<uchar>(r,c)*edgeY.at<uchar>(r,c)));
    

    您可以使用Mat_&lt;Tp&gt; 避免此类问题,无需使用.at 函数也可以更轻松地访问:

    Mat1b edge(317,554,uchar(0));
    for (int r = 0; r < edgeX.rows; r++) {
        for (int c = 0; c < edgeY.cols; c++) {
            edge(r,c) = sqrt((edgeX(r,c)*edgeX(r,c)) + (edgeY(r,c)*edgeY(r,c)));
        }
    }
    

    在这种情况下,您还可以使用 cv::magnitude 执行与 for 循环相同的操作(但它需要 float 的矩阵):

    Sobel(src, edgeX, CV_32F, 1, 0);
    Sobel(src, edgeY, CV_32F, 0, 1); 
    Mat edge;
    magnitude(edgeX, edgeY, edge);
    
    // Convert to CV_8UC1
    edge.convertTo(edge, CV_8UC1);
    

    【讨论】:

    • 很高兴它有帮助;D
    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多