gpt4 book ai didi

c++ - EXC_BAD_ACCESS 错误 OpenCV?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:11 24 4
gpt4 key购买 nike

我正在尝试在 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 : sobel 输出 dY
  • 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)

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

最佳答案

edgeCV_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);

关于c++ - EXC_BAD_ACCESS 错误 OpenCV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com