c++ - 访问冲突读取位置错误 C++ OpenCV While Implementing thinning algorithm

标签 c++ opencv image-processing access-violation

您好,我在网上找到了一个可以产生我需要的结果的算法,我已经在我的程序中实现了这个算法。但是,我不断收到访问冲突读取位置错误。我不确定这是为什么?我应该说我是 C++ 和使用 OpenCV 等库的新手

我的主要功能是这样的:

    int main(int argc, char** argv)
{
cout << "Welcome to the Image to Graph function"<< endl;;

cv::Mat src = cv::imread("M:/Documents/Internship Project/Dr_V_Project/Output Images/FC 100x2_no_holes100.png");
if (!src.data)
    return -1;

cv::Mat bw;
cv::cvtColor(src, bw, CV_BGR2GRAY);
thinningGuoHall(bw);

waitKey(0);
return 0;
}

这个程序的其他功能是:

void thinningGuoHallIteration(cv::Mat& im, int iter)
{
cv::Mat marker = cv::Mat::zeros(im.size(), CV_8UC1);

for (int i = 1; i < im.rows; i++)
{
    for (int j = 1; j < im.cols; j++)
    {
        uchar p2 = im.at<uchar>(i - 1, j);
        uchar p3 = im.at<uchar>(i - 1, j + 1);
        uchar p4 = im.at<uchar>(i, j + 1);     // ERROR SEEMS TO OCCUR HERE!
        uchar p5 = im.at<uchar>(i + 1, j + 1);
        uchar p6 = im.at<uchar>(i + 1, j);
        uchar p7 = im.at<uchar>(i + 1, j - 1);
        uchar p8 = im.at<uchar>(i, j - 1);
        uchar p9 = im.at<uchar>(i - 1, j - 1);

        int C = (!p2 & (p3 | p4)) + (!p4 & (p5 | p6)) +
            (!p6 & (p7 | p8)) + (!p8 & (p9 | p2));
        int N1 = (p9 | p2) + (p3 | p4) + (p5 | p6) + (p7 | p8);
        int N2 = (p2 | p3) + (p4 | p5) + (p6 | p7) + (p8 | p9);
        int N = N1 < N2 ? N1 : N2;
        int m = iter == 0 ? ((p6 | p7 | !p9) & p8) : ((p2 | p3 | !p5) & p4);

        if (C == 1 && (N >= 2 && N <= 3) && m == 0)
            marker.at<uchar>(i, j) = 1;
    }
}

im &= ~marker;
}

void thinningGuoHall(cv::Mat& im)
{
im /= 255;

cv::Mat prev = cv::Mat::zeros(im.size(), CV_8UC1);
cv::Mat diff;

do {
    thinningGuoHallIteration(im, 0);
    thinningGuoHallIteration(im, 1);
    cv::absdiff(im, prev, diff);
    im.copyTo(prev);
} while (cv::countNonZero(diff) > 0);

im *= 255;
}

有人可以帮我解决这个错误吗?

最佳答案

非常简单:您的访问权限超出范围。

您将 ij 迭代到 im.rows-1im.cols-1,分别。当j第一次为im.cols-1时,行

uchar p4 = im.at<uchar>(i, j + 1);

成为

uchar p4 = im.at<uchar>(1, im.cols);

这是越界的。将循环标题更改为

for (int i = 1; i+1 < im.rows; i++)
{
    for (int j = 1; j+1 < im.cols; j++)
    {

并且您不会遇到访问冲突。

关于c++ - 访问冲突读取位置错误 C++ OpenCV While Implementing thinning algorithm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460530/

相关文章:

c++ - 使用 Bind 创建处理程序函数以处理单击的菜单项 - wxWidgets 3.0

c++ - 将字符串的子字符串设置为 vector 的 char 元素时的 EXC_BAD_ACCESS (C++)

c++ - 原始图像和调整后图像之间的关系 (C++/OpenCV)

c++ - 搜索图像上的轮廓

OpenCV videocapture读取摄像头rtsp错误

python - 使用 python 和 opencv 保存视频时出错

c++ - OPENCV waitKey() 方法返回类型

c++ - 为什么在输入参数之前将计算放在代码中时计算不起作用?

c++ - 推断函数指针的模板参数

MATLAB:查找图像中特定 RGB 像素值的索引/计数