65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 LEADTOOLS 进行 AAMVA 条形码驾驶证识别和创建

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019 年 7 月 16 日

CPOL
viewsIcon

23345

本教程将向您介绍用于读取和写入驾驶证中符合 AAMVA 标准的条形码的类和方法。

引言

如果您在过去几年中更新过您的驾驶证,您可能已经注意到其视觉复杂性的增加。许多管理机构在使伪造更加困难方面取得了重大进展。 这种积极变化带来的不幸副作用是,传统的识别算法在面对许多颜色、背景、全息图和布局时变得更加困难。

值得庆幸的是,新的驾驶证上也带有 PDF417 条形码,在北美,这些条形码遵循美国机动车辆管理局 (AAMVA) 制定的规范。 这些条形码体积小、抗错误能力强,并且可以编码大量信息。

本教程将向您介绍用于读取和写入驾驶证中符合 AAMVA 标准的条形码的类和方法。

读取 AAMVA 条形码

由于驾驶证被广泛接受为一种身份证明形式,因此有很多机会可以从中读取信息。 我们在之前关于从驾驶证捕获客户信息的白皮书中介绍了这些概念,因此我们不会在此重复它们。 该论文还讨论了在 AAMVA 监管之前使用 PDF417 条形码。 从那时起,LEADTOOLS 添加了一个新的 AAMVAID 类,它可以为您完成所有字段解析。

有什么大不了的? 看一下 AAMVA 条形码的原始数据

@\n\u001e\rANSI 636004080002DL00410266ZN03070017DLDAQ123456789123\nDCSDOE\nDDEN\nDACJANE\nDDFN\nDAD\nDDGN\nDCAC\nDCBNONE\nDCDNONE\nDBD08152015\nDBB08151987\nDBA08152020\nDBC2\nDAU070 in\nDAYBRO\nDAG1100 NEW BERN AVENUE\nDAIRALEIGH\nDAJNC\nDAK276970001\nDCF0123456789\nDCGUSA\nDAZBRO\nDCLU  \nDCK000012345678NCSVTL01\nDDB10242014\nDDK1\nDDL1\nZNZNADUP\nZNB\nZNC0\n

名字在哪里? 或者出生日期? 您需要计算这个人是否超过 21 岁并被合法允许购买吗? 使用 LEADTOOLS,您可以获得精美、强类型的属性中的此类信息

using (AAMVAID id = BarcodeData.ParseAAMVAData(data.GetData(), false))
{
   Console.WriteLine("Issuer Identification Number: " + id.IssuerIdentificationNumber);
   Console.WriteLine("First Name: " + id.FirstName.Value);
   Console.WriteLine("Last Name: " + id.LastName.Value);
   Console.WriteLine("Over 21?: " + id.Over21);
   // etc.
}

写入 AAMVA 条形码

生成 AAMVA 条形码的原因可能较少,但美国、加拿大和墨西哥的每个州或省的每个机动车辆管理机构都需要能够在他们颁发的许可证上打印它们。 当然,您不能只是在许可证和身份证上打印任何旧的条形码。 与大多数规范一样,它们很难遵循,并且由于研发要求可能会导致重大的开发瓶颈。 LEADTOOLS 通过两种方式简化了这一点:生成 AAMVA 字符串和创建 PDF417 条形码。

首先,您需要将您的客户数据转换为有效的 AAMVA 字符串值。 为了帮助完成此过程,LEADTOOLS 提供了 AAMVAIDBuilder 类。 构建器将帮助组织数据并输出符合 2016 AAMVA CDS 的数据。 在这里,我们初始化 AAMVAIDBuilder,添加一些信息,然后使用 Build 函数生成 AAMVAID 对象

AAMVAIDBuilder builder = new AAMVAIDBuilder();
builder.SetJurisdiction(AAMVAJurisdiction.NorthCarolina, 
   AAMVAID.LookupIssuerIdentificationNumber(AAMVAJurisdiction.NorthCarolina));

// Set primary data
builder.SetVersion(AAMVAVersion.Version2016);
builder.SetJurisdictionVersion("00");
builder.SetNumberOfEntries(1);

// Build the subfile entry as a driver's license (vs. an ID)
builder.SetSubfileType(0, AAMVASubfileType.DL, "DL");

builder.AddDataElementToSubfile(0, "DAC", "John");
builder.AddDataElementToSubfile(0, "DCS", "Doe");
// etc.

// Get the AAMVA string data
byte[] data;
using (AAMVAID id = builder.Build())
{
   data = id.GetBytes();
}

现在我们的客户信息已正确编码为 AAMVA,我们将创建 PDF417 条形码。 感谢 LEAD 在光栅和文档图像技术方面近三十年的经验,尽管条形码的复杂性更高,但此过程甚至比编写 AAMVA 字符串更简单。 在这里,我们生成 BarcodeEngine,设置一些选项以帮助比例使 AAMVA 满意,LEADTOOLS 负责其余的工作。 在这个简单的例子中,我们只是使用条形码的计算边界创建了一个空白图像

BarcodeEngine engine = new BarcodeEngine();

PDF417BarcodeWriteOptions writeOptions = 
  (PDF417BarcodeWriteOptions)engine.Writer.GetDefaultOptions(BarcodeSymbology.PDF417);

//Refer to AAMVA CDS 2016 Section D.3 thru D.11.2

//Must range from 0.0066 to 0.015 inches
writeOptions.XModule = 15; //0.015
                           //Must >= 3
writeOptions.XModuleAspectRatio = 3;
//Error level must be at least 3, 5 is recommended
writeOptions.ECCLevel = PDF417BarcodeECCLevel.Level5;
//Default WidthAspectRatio is 2:1. 4:1 looks similar to ID barcodes in the wild
writeOptions.SymbolWidthAspectRatio = 4;
//Default quiet zone for PDF417 is 2 * XModule

PDF417BarcodeData barcodeData = 
   (PDF417BarcodeData)BarcodeData.CreateDefaultBarcodeData(BarcodeSymbology.PDF417);
barcodeData.SetData(data);
const int resolution = 96; // screen resolution
engine.Writer.CalculateBarcodeDataBounds(LeadRect.Empty,
                                          resolution,
                                          resolution,
                                          barcodeData,
                                          writeOptions);

using (RasterImage image = RasterImage.Create(barcodeData.Bounds.Width, 
                                              barcodeData.Bounds.Height, 24, 
                                              resolution,                                  
                                              RasterColor.FromKnownColor(RasterKnownColor.White)))
{
   engine.Writer.WriteBarcode(image, barcodeData, writeOptions);

   using (RasterCodecs codecs = new RasterCodecs())
   {
      codecs.Save(image, imageFilePath, RasterImageFormat.Png, image.BitsPerPixel);
   }
}

作为检查,我们将像以前一样将图像加载回主条形码演示中并读取数据。

结论

LEADTOOLS 一直处于文档图像和识别技术(如 OCR、表单、条形码和 PDF)的最前沿。 驾驶证和身份证已经变得更加复杂,但随着 AAMVA 条形码的采用,监管也得到了更好的规范。 对于希望快速轻松地创建软件来读取和写入存储在 AAMVA 条形码中的身份数据的开发人员来说,LEADTOOLS 仍然是一个可行的选择。

下载完整的 AAMVA 条形码示例

您可以下载包含上述功能的完整功能演示。要运行此示例,您需要以下条件:

  • LEADTOOLS 免费评估
  • Visual Studio 2010 或更高版本
  • 浏览到 LEADTOOLS 示例文件夹(例如 C:\LEADTOOLS 20\Examples\),您可以在其中找到 LEADTOOLS 中这项技术和更多技术的示例项目。

支持

需要帮助启动和运行此示例吗? 联系我们的支持团队以获得免费的技术支持! 对于定价或许可问题,您可以联系我们的销售团队 (sales@leadtools.com) 或致电 704-332-5532。

© . All rights reserved.