您的位置:首页 > 编程语言 > C语言/C++

一维码EAN 8简介及其解码实现(zxing-cpp)

2017-01-19 21:18 302 查看
一维码EAN 8:属于国际标准条码,由8个数字组成,属EAN的简易编码形式(EAN缩短码)。当包装面积小于120平方公分以下无法使用标准码时,可以申请使用缩短码。

依结构的不同,EAN条码可区分为:

1. EAN 13码: 由13个数字组成,为EAN的标准编码型式(EAN标准码)。

2. EAN 8码: 由8个数字组成,属EAN的简易编码型式(EAN缩短码)。

EAN码的全名为欧洲商品条码(European Article Number),于1977年,由欧洲十二个工业国家所共同发展出来的一种条码。目前已成为一种国际性的条码系统。EAN条码系统的管理是由国际商品条码总会(International Article Numbering Association)负责各会员国的国家代表号码之分配与授权,再由各会员国的商品条码专责机构,对其国内的制造商、批发商、零售商等授予厂商代表号码。

EAN码具有以下特性:

1. 只能储存数字。

2. 可双向扫瞄处理,即条码可由左至右或由右至左扫瞄。

3. 必须有一检查码,以防读取资料的错误情形发生,位于EAN码中的最右边处。

4. 具有左护线、中线及右护线,以分隔条码上的不同部分与撷取适当的安全空间来处理。

5. 条码长度一定,较欠缺弹性,但经由适当的管道,可使其通用于世界各国。

EAN 8码的结构如下图:



EAN 8码具有以下特点:

1. EAN 8码共8位数,包括国别码2位,产品代码5位,及检查码1位。

2. EAN 8从空白区开始共81个模组,每个模组长0.33mm,条码符号长度为26.73mm。

3. EAN8码左右资料码编码规则与EAN 13码相同。

以下是通过zxing-cpp开源库实现的对一维码EAN 8进行解码的测试代码:

#include "funset.hpp"
#include <string>
#include <fstream>
#include <Windows.h>

#include <zxing/LuminanceSource.h>
#include <zxing/common/Counted.h>
#include <zxing/Reader.h>
#include <zxing/aztec/AztecReader.h>
#include <zxing/common/GlobalHistogramBinarizer.h>
#include <zxing/DecodeHints.h>
#include <zxing/datamatrix/DataMatrixReader.h>
#include <zxing/MultiFormatReader.h>
#include <zxing/pdf417/PDF417Reader.h>
#include <zxing/qrcode/QRCodeReader.h>
#include <zxing/oned/CodaBarReader.h>
#include <zxing/oned/Code39Reader.h>
#include <zxing/oned/Code93Reader.h>
#include <zxing/oned/Code128Reader.h>
#include <zxing/oned/EAN8Reader.h>

#include <opencv2/opencv.hpp>

#include "zxing/MatSource.h"

int test_EAN8_decode()
{
std::string image_name = "E:/GitCode/BarCode_Test/test_images/EAN8.png";
cv::Mat matSrc = cv::imread(image_name, 1);
if (!matSrc.data) {
fprintf(stderr, "read image error: %s", image_name.c_str());
return -1;
}

cv::Mat matGray;
cv::cvtColor(matSrc, matGray, CV_BGR2GRAY);

zxing::Ref<zxing::LuminanceSource> source = MatSource::create(matGray);
int width = source->getWidth();
int height = source->getHeight();
fprintf(stderr, "image width: %d, height: %d\n", width, height);

zxing::Ref<zxing::Reader> reader;
reader.reset(new zxing::oned::EAN8Reader);

zxing::Ref<zxing::Binarizer> binarizer(new zxing::GlobalHistogramBinarizer(source));
zxing::Ref<zxing::BinaryBitmap> bitmap(new zxing::BinaryBitmap(binarizer));
zxing::Ref<zxing::Result> result(reader->decode(bitmap, zxing::DecodeHints(zxing::DecodeHints::EAN_8_HINT)));

std::string txt = "E:/GitCode/BarCode_Test/test_images/EAN8.txt";
std::ifstream in(txt);
if (!in.is_open()) {
fprintf(stderr, "fail to open file: %s\n", txt.c_str());
return -1;
}

std::string str1;
std::getline(in, str1);
fprintf(stderr, "actual        result: %s\n", str1.c_str());
std::string str2 = result->getText()->getText();
fprintf(stdout, "recognization result: %s\n", str2.c_str());

if (str1.compare(str2) == 0) {
fprintf(stderr, "=====  recognition is correct  =====\n");
}
else {
fprintf(stderr, "=====  recognition is wrong =====\n");
return -1;
}

in.close();

return 0;
}
测试图像如下:



测试结果如下:



GitHubhttps://github.com/fengbingchun/Barcode_Test
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: