2016-07-03 36 views
1

我使用覆盆子PI相机从图像读取条形码,并且对象需要从相机在我的应用相对较远是。处理前的条形码:Before条码预处理为zbar和

Zbar无法解码此图像中的任何内容,因此我决定尝试手动编辑图像以使其解码。在条形码的单行之间绘制清晰的白线并更改图像的对比度后,此结果由ZBar解码:After

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

+0

看起来你需要条码的更详细的图片(更好的聚焦?) - 更多的像素 - 选择更高分辨率的照相机,变焦镜头,移动条码更接近相机,更大的条形码... – barny

回答

1

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

CV ::标量avgPixelIntensity = CV ::平均值(图像);

使用此值作为阈值,您可以执行图像阈值。这将是相当快的。

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

在这里看到:Image Thresholding Opencv

+0

The问题是平均值可能不会是正确的阈值,因为图像不是半像素黑和半像素白。此外,实际放大时,组成垂直线的灰色像素与“白色”像素之间的差异实际上非常小,因此即使稍微不正确的阈值也会产生严重的影响 – glaba

+0

@glaba您是否可以将图片发送到平均作为一个门槛不会工作?其次,你有没有机会检查OTSU。我建议OTSU在OCR应用中完全用于此目的。如果两者都不起作用,使用边缘检测与Hough Line Detector配对将会得到所有线条,但是然后读取文本字符将会是一个尚未解决的问题。附: OTSU应该在本地计算阈值参数时工作,所以它会在灰线和白色背景之间产生差异。如果你没有使用足够小的窗口,它不会考虑非常黑的线条。 – saurabheights

+0

@glaba错字:最后一行应该说:“那如果你使用的是足够小窗口不会考虑很黑线: – saurabheights

1

尝试对其进行阈值处理。

首先将其转换为灰度图像,然后通过试验和错误尝试获取0-255之间的最佳值,并选择标记为白色,均低于黑色值之上的所有像素。

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

(不知道,如果zbar和库已经这样做了)