我正在尝试将图像的各个像素与特定值进行比较,但是我在"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
可能毫无用处。第三个参数应该是另一个图像。