【问题标题】:Barcode pre-processing for zbarzbar 的条码预处理
【发布时间】:2016-07-03 02:23:53
【问题描述】:

我正在使用树莓派相机从图像中读取条形码,并且在我的应用程序中,对象需要离相机相对较远。处理前的条码:

Zbar 无法从该图像中解码任何内容,因此我决定尝试手动编辑该图像以使其解码。在条码的单行之间画出清晰的白线并改变图像的对比度后,这个结果被ZBar解码:

如何以编程方式从第一张图像转到第二张图像(我现在正在使用 OpenCV 和 python)?

【问题讨论】:

  • 看起来您需要更详细的条形码图片(更好地聚焦?) - 更多像素 - 选择是更高分辨率的相机、变焦镜头、将条形码移近相机、更大的条形码...

标签: opencv image-processing raspberry-pi barcode zbar


【解决方案1】:

考虑到最暗的区域是黑色的,并且任何灰色区域都需要转换为白色,因此问题非常简单。尝试计算图像的平均强度。

cv::Scalar avgPixelIntensity = cv::mean( image );

使用这个值作为阈值,你可以做图像阈值。这会很快。

您也可以尝试 Otsu Thresholding,这是一种自适应阈值技术。这将比上述方法慢,但在图像有其他伪影(如阴影)的情况下会提供更好的结果。

请看这里:Image Thresholding Opencv

【讨论】:

  • 问题是平均值可能不是正确的阈值,因为图像不是半像素黑色和半像素白色。此外,当您实际放大时,构成垂直线的灰色像素与它们之间的“白色”像素之间的差异实际上非常小,因此即使稍微不正确的阈值也会产生剧烈的影响
  • @glaba 你能发布一张将平均值作为阈值不起作用的图像吗?其次,您是否有机会检查 OTSU。我推荐 OTSU,因为它在 OCR 应用程序中正是用于此目的。如果两者都不起作用,则使用与霍夫线检测器配对的边缘检测将获得所有线条,但读取文本字符将是一个未解决的问题。附: OTSU 应该在本地计算阈值参数时工作,因此它将获取灰线与其白色背景之间的差异。如果您没有使用足够小的窗口,它不会考虑非常黑的线条。
  • @glaba Typo:最后一行应该说:“如果您使用足够小的窗口,它不会考虑非常黑的线条。:
  • @glaba:您能否评论一下您的最终方法是什么——Otsu 或多层次的阈值化?这将在未来对其他人有所帮助。
  • 我使用了自适应阈值,但它仍然不可靠(虽然我怀疑这更多是由于相机的限制,它是固定焦点)
【解决方案2】:

尝试设置阈值。

首先将其转换为灰度,然后通过反复试验尝试获得 0-255 之间的最佳值,并将高于所选值的所有像素标记为白色,所有低于所选值的像素都标记为黑色。

如果它不起作用,则输入图像需要更清晰。

(不确定zbar库是否已经这样做了)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多