c++ - 如何配置 C++ Zbar 扫描仪只解码 QR 码数据类型?

标签 c++ opencv qr-code zbar

我正在使用 Zbar C++ 库解码 QRCode,使用本教程: https://www.learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/

这里我只需要解码图像中的 QRCode,但是使用本教程它可以解码图像中的 QRcode 和条形码。

在教程中它说只解码 QRCode 我们必须正确配置 Zbar Imagescanner。

在教程中,他们使用以下配置来解码 QRCode 和条形码 ImageScanner扫描仪; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);

因此,为了仅解码 QRCode,我使用以下配置: ImageScanner扫描仪; scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);

但使用此 Zbar 配置仍然可以解码 QRCode 和条形码数据。我得到的解码数据类型为 EAN-13 和 QR-Code。

我如何正确配置 Zbar sccanner 以便它只解码 QR 码数据类型?

//Reference:https://www.learnopencv.com/opencv-qr-code-scanner-c-and-python/

#include <iostream>
#include <algorithm>
#include <vector>
#include <zbar.h>

#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
using namespace zbar;

typedef struct
{
  string type;
  string data;
  vector <Point> location;
}decodedObject;

// Find and decode barcodes and QR codes
void decode(Mat &im, vector<decodedObject>&decodedObjects)
{

  // Create zbar scanner
  ImageScanner scanner;

  // Configure scanner
  scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);

  // Convert image to grayscale
  Mat imGray;
  cvtColor(im, imGray,CV_BGR2GRAY);

  // Wrap image data in a zbar image
  Image image(im.cols, im.rows, "Y800", (uchar *)imGray.data, im.cols * im.rows);

  // Scan the image for barcodes and QRCodes
  int n = scanner.scan(image);

  // Print results
  for(Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol)
  {
    decodedObject obj;

    obj.type = symbol->get_type_name();
    obj.data = symbol->get_data();

    // Print type and data
    cout << "Type : " << obj.type << endl;
    cout << "Data : " << obj.data << endl << endl;
    decodedObjects.push_back(obj);
  }
}

int main(int argc, char *argv[])
{

  // Read image
  string imagepath = argv[1];
  Mat im = imread(imagepath);

   // Variable for decoded objects
   vector<decodedObject> decodedObjects;

   // Find and decode barcodes and QR codes
   decode(im, decodedObjects);

   return 0;
 }

testImage.png


Resulted Output:
Type : QR-Code
Data : http://LearnOpenCV.com

Type : EAN-13
Data : 0036000291452

Expected Output:
Type : QR-Code
Data : http://LearnOpenCV.com

最佳答案

我假设你需要先禁用所有

    // disable all
    scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 0);

    // enable qr
    scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);

关于c++ - 如何配置 C++ Zbar 扫描仪只解码 QR 码数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56068886/

相关文章:

c++ - 接口(interface)名称(eth0 等)的等效 inet_addr C/C++、Linux

c# - 当我从 System.Drawing.Bitmap 对象转换为 cv::Mat 时,位图被破坏

opencv - 从计算机断层扫描图像获取皮带速度

python - 保存和读取二进制图像

c# - Xamarin - 在表单中显示二维码

PHP - 自定义二维码?

c++ - 将 VAO+IBO 与 GLSL 着色器结合使用

c++ - OpenGL 4 : Draw with glVertexAttrib

c++ - 如何知道函数何时必须是虚拟的?

android - 不使用 google play 服务扫描二维码