OpenCV提供了一些教程,用于检测实时视频流中的模式。例如:
http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html
然而,这并不是我真正想要做的。我有静态图像,比如.jpgs,包括2D条形码。
我的目标是从图像中分离出一个或多个二维条形码。如果.jpg是1000像素乘500像素,而2D条形码只有200像素乘200像素,我只想将200x200像素的样本保存到输出文件中。
我怀疑这需要Haar级联或LBP级联。我怀疑特征检测无法做到这一点。
然而,我找不到任何解决这个问题的教程。
此外,opencv发行版会自动构建一些似乎相关的可执行文件,如opencv_perf_objdetect和opencv_test_objddetect,但它们似乎与教程或文档中的任何其他内容都不对应。
问题:如何在静态图像中检测子图像的问题实际上在OpenCV文档中有解释吗?如果是,在哪里?
谢谢。
我最近在做一个条形码检测项目。一开始,我认为一个简单的机器学习算法与基于纹理的描述符相结合可以解决条形码检测问题。然而,我遇到了一些问题,因为在我的应用程序中,我不知道是否有条形码,它的大小、类型(UPC-a、EAN…)、方向……假设要尝试许多组合来定位条形码。
我也没有处理或没有时间创建一个适合我所拥有的图像类型的训练数据集,所以我没有继续使用这个解决方案。然后我读了几篇文章。许多专用的条形码检测方法都是从假设图像中有条形码开始的,因此他们试图找到它。此外,一些算法假设条形码是水平的,并将此假设作为先验信息。
我找到的最好的解决方案是BLaDE(http://www.ski.org/Rehab/Coughlan_lab/BLaDE/BLaDE_TechReport.pdf)。该代码也可以在网上找到,所以你可以很容易地测试它。唯一的问题是它只为UPC-A条形码设计。
要继续,对你来说最好的解决方案取决于几个方面:
-
条形码的类型
-
你肯定知道有条形码
-
它的方向:任意/给定角度的
-
运行的实时应用程序/设备
-
你处理了一个训练集
祝你好运!
老实说,用级联检测东西的基本过程很简单。
这并不重要,如果你有一个haar、lbp或hog,也不管你是在人脸、香蕉还是条形码上训练它,它都会试图定位它训练过的东西。
// first load the cascade
string cascade_file = "my_barcode.xml";
CascadeClassifier cascade;
if( !cascade.load( cascade_filee ) ){ printf("Error loading cascaden"); 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