Opencv 断言错误

Posted

技术标签:

【中文标题】Opencv 断言错误【英文标题】:Opencv assertion errors 【发布时间】:2018-05-29 14:22:23 【问题描述】:

我使用的是opencv 3.2ver,在我的代码中,它有一些错误 这是我的错误代码:

"CV_DbgAssert((无符号)(i1 * DataType<_tp>::channels)

binary_Mat[0] = Mat_Sum(image, i, j - 3); 导致错误。

请告诉我问题是什么

int Mat_Sum(Mat& image, int i, int j)


int sum = image.at<uchar>(i-1, j-1) + image.at<uchar>(i-1, j) + image.at<uchar>(i-1, j+1) +
    image.at<uchar>(i, j-1) + image.at<uchar>(i, j) + image.at<uchar>(i, j+1) +
    image.at<uchar>(i+1, j-1) + image.at<uchar>(i+1, j) + image.at<uchar>(i+1, j+1);
return sum / 9;


int main()


    Mat image0 = imread("rena.jpg");
    Mat image;
    cvtColor(image0, image, CV_BGR2GRAY);
    const int width = image.rows;
    const int height = image.cols;

    Mat result_img = image.clone();

    int binary_Mat[8];
    for (int i = 3; i < height - 3; i++)
    
        for (int j = 3; j < width - 3; j++)
        
            result_img.at<uchar>(i, j) = 0;
            binary_Mat[0] = Mat_Sum(image, i, j - 3);
            binary_Mat[1] = Mat_Sum(image, i + 3, j - 3);
            binary_Mat[2] = Mat_Sum(image, i + 3, j);
            binary_Mat[3] = Mat_Sum(image, i + 3, j + 3);
            binary_Mat[4] = Mat_Sum(image, i, j + 3);
            binary_Mat[5] = Mat_Sum(image, i - 3, j + 3);
            binary_Mat[6] = Mat_Sum(image, i - 3, j);
            binary_Mat[7] = Mat_Sum(image, i - 3, j - 3);

            int criterion = Mat_Sum(image, i, j);
            for (int k = 0; k < 8; k++) 
                if (binary_Mat[k] > criterion)
                    binary_Mat[k] = 1;
                else
                    binary_Mat[k] = 0;
            

            int decimal = 0;
            for (int k = 0; k < 8; k++)
                decimal += binary_Mat[k] * pow(2, 8 - k);

            result_img.at<uchar>(i, j) = decimal;
        
    
    return 0;

【问题讨论】:

我建议将您的错误放在代码格式化块中以提高可读性。 【参考方案1】:

你混淆了高度和宽度 - 改变:

const int width = image.rows;
const int height = image.cols;

到:

const int height = image.rows;
const int width = image.cols;


看起来您还试图越界访问image,例如
        binary_Mat[0] = Mat_Sum(image, i, j - 3);

将尝试访问Mat_Sum 内的负索引列索引。一种可能的解决方法是更改​​:

for (int i = 3; i < height - 3; i++)

    for (int j = 3; j < width - 3; j++)
    

到:

for (int i = 4; i < height - 4; i++)

    for (int j = 4; j < width - 4; j++)
    

【讨论】:

【参考方案2】:

看起来你已经交换了行和列: 宽度 = image.rows 高度=image.cols

因此,当您调用您的函数时,您传递的“i”和“j”实际上是互换的 因此,您的 natrix 值超出范围

尝试更改为: 宽度=image.cols 高度=图像.rows 这应该工作

【讨论】:

以上是关于Opencv 断言错误的主要内容,如果未能解决你的问题,请参考以下文章

调试断言错误 - OpenCV

Opencv 断言错误

是啥导致“OpenCV(4.0.1)错误:断言失败(m.dims <= 2)”

为啥我会收到此 OpenCV 错误断言失败?

图像处理 opencv 3.0 断言失败错误

java opencv错误内存不足和断言失败