断言在与 opencv 的像素比较中失败

Assertion failed on pixel comparison with opencv

本文关键字:比较 失败 像素 opencv 断言      更新时间:2023-10-16

我正在尝试将图像的各个像素与特定值进行比较,但是我在"if"语句中有一个断言失败的异常(删除"if"都有效)。

这段代码是:

Sobel(gray, grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
addWeighted(abs_grad_x, 1, 0, 1, 0, grad);
Mat imfiltered = Mat::zeros(grad.size(), grad.type());
//Find and extract shape 
for (i = 20; i < (grad.cols-20); i++) {
    for (j = 20; j < (grad.rows-20); j++) {
        if (grad.at<char>(i, j) >= 40) {
            imfiltered.at<char>(i, j) = grad.at<char>(i, j);
        }
        else {
            imfiltered.at<char>(i, j) = 0;
        }
    }
}

问题出在if (grad.at<char>(i, j) >= 40)声明上。

和错误:

Assertion failed ((unsigned)i0 < (unsigned)size.p[0]) in cv::Mat::at

这种说法有什么问题?我怎样才能正确地完成这个比较?

提前谢谢。

你倒置了行和列。由于先迭代行然后迭代列的速度更快,因此您需要将循环更改为:

for (int i = 20; i < (grad.rows-20); i++) {
    for (int j = 20; j < (grad.cols-20); j++) {
       ...

也:

  • grad可能是一个CV_16SC1,所以你需要使用grad.at<short>(...)
  • 您可以使用cv::threshold而不是循环
  • 呼吁addWeighted可能毫无用处。第三个参数应该是另一个图像。