我想使用 OpenCV 检测静态图像中的二维条码,但文档似乎没有涵盖它

Posted

技术标签:

【中文标题】我想使用 OpenCV 检测静态图像中的二维条码,但文档似乎没有涵盖它【英文标题】:I want to use OpenCV to detect 2D barcodes in a static image but the documentation doesn't seem to cover it 【发布时间】:2014-04-08 07:10:58 【问题描述】:

OpenCV 有一些教程处理尝试检测实时视频流中的模式。 例如:

http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

但是,这并不是我真正想要做的。我有静态图像,例如 .jpgs, 包括二维条码。

我的目标是从图像中分离出一个或多个二维条码。如果 .jpg 是 1000 x 500 像素,而二维条码只有 200 x 200 像素,我只想将 200x200 像素的样本保存到输出文件中。

我怀疑这需要 Haar 级联或 LBP 级联。我怀疑特征检测无法做到这一点。

但是,我找不到任何解决此问题的教程。

此外,opencv 发行版会自动构建一些看似相关的可执行文件,例如 opencv_perf_objdetect 和 opencv_test_objdetect,但它们似乎与教程不对应,也与文档中的任何其他内容不对应。

问题:如何在静态图像中检测子图像的问题实际上是否在 OpenCV 文档中的某处进行了解释?如果有,在哪里?

谢谢。

【问题讨论】:

请发布示例图片 【参考方案1】:

我最近在从事一个条形码检测项目。一开始我以为简单的机器学习算法结合基于纹理的描述符可以解决条形码检测问题。但是,我遇到了几个问题,因为在我的应用程序中,我不知道是否有条形码,它的大小,它的类型(UPC-A,EAN ......),它的方向......它应该尝试多种组合为了定位条形码。

我也没有处理或没有时间创建适合我拥有的图像类型的训练数据集,因此我没有继续使用此解决方案。 然后我看了几篇文章。许多专用的条码检测方法都是从图像中有条码的假设开始的,因此他们试图找到它。此外,有些算法假设条码是水平的,并以此假设为先验信息。

我找到的最佳解决方案是 BLaDE (http://www.ski.org/Rehab/Coughlan_lab/BLaDE/BLaDE_TechReport.pdf)。该代码也可在网络上获得,因此您可以轻松地对其进行测试。唯一的问题是它是专为 UPC-A 条码设计的。

要恢复,最适合您的解决方案取决于几个方面:

条码类型

你肯定知道有条码

它的方向:任意/给定角度

运行它的实时应用程序/设备

你处理了一个训练集

祝你好运!

【讨论】:

谢谢。我的情况需要二维条码,许多现有的软件解决方案都不支持。 BLaDE 似乎不适合我的情况,但也许我可以找到别的东西。 哦,抱歉,我错过了“2D”的提及。【参考方案2】:

老实说,检测级联的基本过程很简单。

没关系,如果你有一个 haar、lbp 或 hog,也不管你是在面部、香蕉还是条形码上训练它,它只会尝试对它训练过的东西进行本地化。

// first load the cascade
string cascade_file = "my_barcode.xml";
CascadeClassifier cascade;
if( !cascade.load( cascade_filee ) ) printf("Error loading cascade\n"); return -1; ;

// then we need a test image, should be grayscale (but will get converted internally if not)
Mat img = imread("mybar.png", 0); // 0==>"load gray"
if ( img.empty() )  /* only fools don't check resource loading */ 

// now we can check if it found something, we'll get a Rect for each found item:
std::vector<Rect> rects;
cascade.detectMultiScale( img, rects, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );
for ( size_t i = 0; i < rects.size(); i++ )
    // do something with rects[i] ...
    // i.e. filter for the largest boundingRect()
    // Mat subimg = img(rects[i]); // 'cropped' subimage

【讨论】:

如果您不关心算法细节,我建议您使用 zbar。它带有一些简单的例子。它易于理解和使用。

以上是关于我想使用 OpenCV 检测静态图像中的二维条码,但文档似乎没有涵盖它的主要内容,如果未能解决你的问题,请参考以下文章

Python3.8+OpenCV检测图像中二维码的位置

使用opencv c#检测图像中的文本块

如何使用opencv从图像中检测文本

如何定义阈值以仅检测图像中的绿色对象:Opencv [重复]

使用 OpenCV 进行图像检测

OpenCV-Python-图像梯度与边缘检测