我正在尝试将图像的各个像素与特定值进行比较,但我在'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
这句话怎么了?我怎样才能正确完成这种比较?
提前致谢。
答案 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
的调用可能毫无用处。第三个参数应该是另一个图像。