我正在使用Zbar C ++库通过以下教程解码QRCode: https://www.learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/
这里我只需要解码图像中的QRCode,但是使用本教程,它可以解码图像中的QRcode和条形码。
在教程中,它说仅解码QRCode,我们必须正确配置Zbar Imagescanner。
在教程中,他们使用以下配置对QRCode和条形码进行解码
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
因此,为了仅解码QRCode,我正在使用以下配置:
ImageScanner scanner;
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;
}
Resulted Output:
Type : QR-Code
Data : http://LearnOpenCV.com
Type : EAN-13
Data : 0036000291452
Expected Output:
Type : QR-Code
Data : http://LearnOpenCV.com
答案 0 :(得分:1)
我认为您首先需要禁用所有
// disable all
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 0);
// enable qr
scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);