Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想使用OpenCV检测静态图像中的二维条形码,但文档没有';我似乎没法掩盖它_Opencv_Image Processing - Fatal编程技术网

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

我想使用OpenCV检测静态图像中的二维条形码,但文档没有';我似乎没法掩盖它,opencv,image-processing,Opencv,Image Processing,OpenCV有一些教程,介绍如何在实时视频流中检测模式。 例如: 然而,这并不是我真正想要做的。我有静态图像,比如.jpgs, 包括二维条形码 我的目标是从图像中分离出一个或多个二维条形码。如果.jpg是1000像素乘500像素,而2D条形码是200像素乘200像素,那么我只想将200x200像素的样本保存到一个输出文件中 我怀疑这需要Haar级联或LBP级联。我怀疑功能检测无法做到这一点 但是,我找不到任何解决此问题的教程 此外,opencv发行版自动构建一些似乎相关的可执行文件,例如ope

OpenCV有一些教程,介绍如何在实时视频流中检测模式。 例如:

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

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

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

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

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

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


谢谢。

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

这没关系,如果你有一个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
//首先加载级联
字符串cascade\u file=“my\u barcode.xml”;
级联分类器级联;
如果(!cascade.load(cascade_filee)){printf(“错误加载cascade\n”);返回-1;};
//然后我们需要一个测试图像,应该是灰度的(但如果不是,将在内部转换)
Mat img=imread(“mybar.png”,0);//0==>“加载灰色”
如果(img.empty()){/*只有傻瓜才不检查资源加载*/}
//现在我们可以检查它是否找到了什么,我们将为每个找到的项目获取一个Rect:
std::向量矩形;
检测多尺度(img,rects,1.1,2,0 |级联|尺度|图像,大小(30,30));
对于(size_t i=0;i
我最近在做一个条形码检测项目。起初,我认为简单的机器学习算法结合基于纹理的描述符可以解决条形码检测问题。然而,我遇到了几个问题,因为在我的应用程序中,我不知道是否有条形码,它的大小,它的类型(UPC-a,EAN…,它的方向…,它假设尝试多种组合以定位条形码

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

我找到的最佳解决方案是刀片()。该代码也可以在web上获得,因此您可以轻松地对其进行测试。唯一的问题是,它是专为UPC-A条形码设计的

要继续,您的最佳解决方案取决于以下几个方面:

  • 条形码的类型

  • 你肯定知道有条形码

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

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

  • 您可以处理一个训练集


祝你好运

请张贴一个例子,谢谢。我的情况需要2D条形码,这是许多现有软件解决方案所不支持的。BLaDE似乎不适合我的情况,但也许我可以找到其他东西。哦,对不起,我错过了“2D”一词。如果你不关心算法细节,我建议zbar。它附带了一些简单的例子。它易于理解和使用。