与opencv

时间:2017-10-30 10:39:11

标签: c++ opencv

我正在尝试将图像的各个像素与特定值进行比较,但我在'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

这句话怎么了?我怎样才能正确完成这种比较?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您倒置了行和列。 由于首先在行上然后在列上进行迭代会更快,因此需要将循环更改为:

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的调用可能毫无用处。第三个参数应该是另一个图像。