C++ EXC\u错误\u访问错误OpenCV?

C++ EXC\u错误\u访问错误OpenCV?,c++,opencv,debugging,pointers,C++,Opencv,Debugging,Pointers,我正在尝试在OpenCV中编写图像分割代码。作为图像处理的一部分,我尝试使用Sobel滤波器检测测试图像的边缘 为了找到dX和dY方向上梯度的大小,我计算了两个梯度的欧氏距离。但是当我运行代码时,我得到了上面的错误。我知道当我试图“访问”内存中不可用的位置时会发生上述错误,但我确信我已经在代码中定义了所有Mat 这是我代码的一部分 //Blur the raw image to remove noise GaussianBlur(src, src, kernel, 2); //Run sobe

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

为了找到dX和dY方向上梯度的大小,我计算了两个梯度的欧氏距离。但是当我运行代码时,我得到了上面的错误。我知道当我试图“访问”内存中不可用的位置时会发生上述错误,但我确信我已经在代码中定义了所有
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)));
    }
}
尝试访问edge.at(316395)时

如何调试这个?
我做错了什么?

edge
CV\u 8UC1
类型的矩阵,意思是
uchar
的矩阵,而不是
double

您需要在处使用
访问它:

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

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


很高兴这有帮助;D
 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)));
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)));
    }
}
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);