cv::adaptiveThreshold 中的断言失败 (blockSize % 2 == 1 && blockSize > 1)

Posted

技术标签:

【中文标题】cv::adaptiveThreshold 中的断言失败 (blockSize % 2 == 1 && blockSize > 1)【英文标题】:Assertion failed (blockSize % 2 == 1 && blockSize > 1) in cv::adaptiveThreshold 【发布时间】:2014-12-03 10:00:36 【问题描述】:

我正在尝试做一个自适应阈值:

cv::Mat mat = cv::imread(inputFile);
cv::cvtColor(mat, mat, CV_BGR2GRAY);
cv::adaptiveThreshold(mat, mat, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 20, 0);
cv::imwrite(outputFile, mat);

但它失败并显示此消息:

OpenCV Error: Assertion failed (blockSize % 2 == 1 && blockSize > 1) in cv::adaptiveThreshold, file ..\..\..\..\opencv\modules\imgproc\src\thresh.cpp, line 797

有什么问题?

【问题讨论】:

【参考方案1】:

问题是我为 blockSize 设置了偶数,而它只需要奇数,因此将其从 20 更改为 21 修复了断言失败:

cv::adaptiveThreshold(mat, mat, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 21, 0);

The docs 有点提到它,但它们并不明确,如果 blockSize 不是奇数,它将失败:

blockSize – 用于计算像素阈值的像素邻域的大小:3、5、7 等。

如您所见,它没有说“如果 blockSize 不是奇数,它将失败”。

【讨论】:

一个像素的 20x20 邻域必然是不对称的。可以理解为什么禁止这样做。 W.r.t.您的最后一行,如果您将无效参数传递给 all 函数,它们可能会失败。对于 OpenCV 中所有函数的所有参数,重复该语句 10.000 次是过分的。例如,也没有说明 blockSize 应该小于您的图像。也就是说,OpenCV 文档并不是最好的。好的库会说明图像边缘的行为方式。

以上是关于cv::adaptiveThreshold 中的断言失败 (blockSize % 2 == 1 && blockSize > 1)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-自适应阈值函数cv::adaptiveThreshold

OpenCV-自适应阈值函数cv::adaptiveThreshold

thresh.cpp:1676: 错误: (-215:Assertion failed) src.type() == CV_8UC1 in function 'cv::adaptiveThreshol

OpenCV 自适应阈值 OCR

Android 中的断字

python opencv图像阈值处理