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

dat*_*ent 6 opencv image-processing

OpenCV有一些教程涉及尝试检测实时视频流中的模式.例如:

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

但是,这并不是我想要做的.我有静态图像,例如.jpgs,包括2D条形码.

我的目标是从图像中隔离一个或多个2D条形码.如果.jpg是1000像素乘500像素,而2D条形码只是200像素乘200像素,我只想将200x200像素样本保存到输出文件中.

我怀疑这需要Haar级联或LBP级联.我怀疑功能检测无法做到这一点.

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

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

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

谢谢.

ber*_*rak 0

老实说,用级联检测某些东西的基本过程很简单。

没关系,如果你有 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
Run Code Online (Sandbox Code Playgroud)