EXC_BAD_ACCESS错误OpenCV?

葡萄酒

我正在尝试在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输出
  • edgeYdY的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<double>(316,395)

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

三木

edge是类型的矩阵CV_8UC1,表示的矩阵uchar,而不是的矩阵double

您需要使用以下命令进行访问at<uchar>

 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_<Tp>,从而无需使用该.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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章