使用 IronOCR 在 C# 中提取护照数据

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronOCR 的 ReadPassport 方法仅需一行 C# 代码,即可从护照图像中提取姓名、护照号码、出生日期和有效期等结构化数据,非常适合用于移民和安全应用。

在机场值机柜台和安检等应用和系统中,工作人员每天都要处理大量护照,因此拥有一个能够准确提取关键旅客信息的可靠系统对于确保高效、简化的出入境流程至关重要。 IronOCR 库提供先进的 OCR 功能,专门针对护照读取进行了优化,其底层采用Tesseract 5 ,并结合了机器学习增强技术。

快速入门:一行代码提取护照 MRZ 信息

本示例演示了如何使用 OcrInput 加载护照图像,使用 ReadPassport() 提取数据,并从返回的 PassportInfo 中访问姓名、号码和日期等结构化字段。 无需复杂的设置,只需一行简单明了的文字。与传统的 Tesseract 实现不同,IronOCR 提供了专门用于文档提取的简化 API。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronOcr

    PM > Install-Package IronOcr
  2. 复制并运行这段代码。

    var passportInfo = new IronOcr.IronTesseract().ReadPassport(new IronOcr.OcrInput("passport.jpg")).PassportInfo;
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronOCR

    arrow pointer

如何在 C# 中提取护照数据?

例如,我们将使用护照图像作为输入来展示 IronOCR 的功能。 使用 OcrInput 加载图像后,您可以利用 ReadPassport 方法识别护照并从中提取信息。 此方法返回一个 OcrPassportResult 对象,其中包含 PersonalNumber 以及 DateOfIssue

ReadPassport 方法是 IronOCR 专业文档读取功能的一部分,该功能还包括读取车牌磁墨字符(MICR)支票及其他结构化文档的方法。 该方法使用先进的计算机视觉技术来自动定位和提取 MRZ(机器可读区域)区域。

[{我:(

  • 该方法目前仅适用于基于英语的护照。
  • 在 .NET Framework 上使用高级扫描功能需要项目在 x64 架构上运行。
  • Mac 用户请注意,ReadPassport 方法目前不会自动旋转输入内容。 使用输入时,请确保 MRZ 始终位于文件底部;否则,处理将失败。 )}]

我应该使用哪种护照图片格式?

IronOCR 支持各种 图像格式,包括 JPG、PNG、TIFF 和 BMP。为获得最佳效果,请确保您的护照图像具有足够的分辨率(至少 300 DPI)和适当的光照。 如果扫描质量较低,可以调整 DPI 设置

美国护照数据页面示例,显示传记字段、日期和用于数据提取演示的机器可读区域

提取护照数据需要哪些代码?

下面的示例演示了提取护照数据的完整过程。 对于处理多本护照的应用程序,请考虑实施多线程支持以提高性能。 您还可以跟踪OCR进度,以了解长期运行的操作。

:path=/static-assets/ocr/content-code-examples/how-to/read-passport-read-passport.cs
using IronOcr;
using System;

// Instantiate OCR engine
var ocr = new IronTesseract();

using var inputPassport = new OcrInput();

inputPassport.LoadImage("passport.jpg");

// Perform OCR
OcrPassportResult result = ocr.ReadPassport(inputPassport);

// Output passport information
Console.WriteLine(result.PassportInfo.GivenNames);
Console.WriteLine(result.PassportInfo.Country);
Console.WriteLine(result.PassportInfo.PassportNumber);
Console.WriteLine(result.PassportInfo.Surname);
Console.WriteLine(result.PassportInfo.DateOfBirth);
Console.WriteLine(result.PassportInfo.DateOfExpiry);
Console.WriteLine(result.PassportInfo.Gender);
Console.WriteLine(result.PassportInfo.DocumentType);
Console.WriteLine(result.PassportInfo.Nationality);
Console.WriteLine(result.PassportInfo.NationalityCode);
Console.WriteLine(result.PassportInfo.IssuingCountryCode);
Console.WriteLine(result.PassportInfo.PersonalNumber);
Console.WriteLine(result.PassportInfo.DateOfIssue);
Imports IronOcr
Imports System

' Instantiate OCR engine
Dim ocr As New IronTesseract()

Using inputPassport As New OcrInput()
    inputPassport.LoadImage("passport.jpg")

    ' Perform OCR
    Dim result As OcrPassportResult = ocr.ReadPassport(inputPassport)

    ' Output passport information
    Console.WriteLine(result.PassportInfo.GivenNames)
    Console.WriteLine(result.PassportInfo.Country)
    Console.WriteLine(result.PassportInfo.PassportNumber)
    Console.WriteLine(result.PassportInfo.Surname)
    Console.WriteLine(result.PassportInfo.DateOfBirth)
    Console.WriteLine(result.PassportInfo.DateOfExpiry)
    Console.WriteLine(result.PassportInfo.Gender)
    Console.WriteLine(result.PassportInfo.DocumentType)
    Console.WriteLine(result.PassportInfo.Nationality)
    Console.WriteLine(result.PassportInfo.NationalityCode)
    Console.WriteLine(result.PassportInfo.IssuingCountryCode)
    Console.WriteLine(result.PassportInfo.PersonalNumber)
    Console.WriteLine(result.PassportInfo.DateOfIssue)
End Using
$vbLabelText   $csharpLabel

ReadPassport 可以提供哪些输出?

提取的数据将以结构化格式返回,以便于与现有系统集成。 OcrResult提供了对所有提取信息的全面访问。

调试控制台显示从 OCR 处理中提取的护照数据:姓名、国家、护照号码和日期

然后,我们访问从 OcrPassportResult 对象获取的 PassportInfo 数据成员。 提取过程可自动处理各种护照布局和格式,在不同的签发国家提供一致的结果。

  • PassportInfo 的一个属性,返回护照输入字段中指定的名称(作为字符串)。 这对应于第一行MRZ数据,位置4到44。
  • PassportInfo 的一个属性,返回护照输入中的国家/地区(字符串形式)。 这相当于 MRZ 数据行的第一行,位置 2 至 3。 返回的字符串拼出了发行国的全名,而不是缩写。 在我们的例子中,USA 返回 "美利坚合众国"。
  • PassportInfo 的一个属性,返回护照输入的护照号码(字符串形式)。 这对应于第二行MRZ数据,位置1到9。
  • PassportInfo 的一个属性,返回护照输入字段中的姓氏(作为字符串)。 这对应于第一行MRZ数据,位置4到44。
  • PassportInfo 的一个属性,返回护照输入字段中的出生日期,格式为 YYYY-MM-DD 的字符串。 这对应于第二行MRZ数据,位置14到19。
  • PassportInfo 的一个属性成员,返回护照输入字段的到期日期,格式为 YYYY-MM-DD 的字符串。 这相当于 MRZ 数据行的第二行,位置 22 至 27。
  • Gender:将 MRZ 第 21 位中的性别信息返回为 Gender.FemaleGender.Unspecified
  • DocumentType:返回 MRZ 第 1-2 位所对应的证件类型,例如"P"代表护照,"PS"代表公务证件,"PD"代表外交证件。
  • 国籍:返回根据 MRZ 第 11-13 位生成的完整英文国家名称。
  • 国籍Code:返回 MRZ 第 11-13 位处的原始 ISO 3166-1 alpha-3 代码。
  • IssuingCountryCode:返回来自 MRZ 第 3-5 位所对应的签发国家的原始 ISO 3166-1 alpha-3 代码。
  • PersonalNumber:从 MRZ 的第 29 至 42 位返回可选的国民身份证号码。
  • DateOfIssue:通过在 27 种语言中进行尽最大努力的标签匹配,返回从视觉检查区 (VIZ) 提取的签发日期。

我可以从护照中提取哪些 MRZ 信息?

IronOCR 可读取任何遵循(国际民用航空组织)ICAO标准的护照底部两行中包含的 MRZ 信息。 MRZ 数据由两行数据组成,每组位置包含唯一的信息。 下面的简表显示了哪些信息与该行的索引相对应。

IronOCR 中的 MRZ 解析功能旨在处理打印质量和图像方向的变化。 对于具有挑战性的文档,您可以应用图像校正过滤器来提高识别准确性。

MRZ 部分看起来像什么?

MRZ 通常位于护照页面的底部,由两行标准化文本组成。 了解 MRZ 结构有助于排除提取问题和验证结果。

美国护照页面,红框中突出显示机器可读区域 (MRZ),显示编码字母数字数据行

第一排

职位 字段 说明
1文档类型通常"P"代表护照。
2-3签发国三字母国家代码(ISO 3166-1 alpha-3)
4-44姓氏和名字姓氏后跟"<<",名字后跟"<"分隔。

第二排

职位 字段 说明
1-9护照号码唯一护照号码
10校验位(护照号码)护照号码校验位
11-13国籍三字母国籍代码(ISO 3166-1 alpha-3)
14-19出生日期出生日期(YYMMDD格式)
20校验位(出生日期)出生日期校验位
21性别性别('M' 代表男性,'F' 代表女性,'X' 代表未指定)
22-27到期日期到期日期(YYMMDD 格式)
28校验位(到期日期)有效期校验位
29-42个人号码可选的个人号码(通常为国民身份证号码)
43校验位(个人号码)个人号码的校验位
44校验位(复合)总体校验位

如何调试和验证护照提取结果?

我们还可以通过获取从护照图像中提取的原始文本和置信度来验证 IronOCR 的结果,从而确认提取的信息是否准确。 以上述示例为例,我们可以访问 ConfidenceText 对象的 OcrPassportResult 属性。

出于调试目的,您可能需要高亮显示文本区域,以便直观地验证哪些区域已被识别。 该功能在排除提取问题或优化扫描区域时特别有用。

:path=/static-assets/ocr/content-code-examples/how-to/read-passport-debug.cs
using IronOcr;
using System;

// Instantiate OCR engine
var ocr = new IronTesseract();

using var inputPassport = new OcrInput();

inputPassport.LoadImage("passport.jpg");

// Perform OCR
OcrPassportResult result = ocr.ReadPassport(inputPassport);

// Output Confidence level and raw extracted text
Console.WriteLine(result.Confidence);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System

' Instantiate OCR engine
Private ocr = New IronTesseract()

Private inputPassport = New OcrInput()

inputPassport.LoadImage("passport.jpg")

' Perform OCR
Dim result As OcrPassportResult = ocr.ReadPassport(inputPassport)

' Output Confidence level and raw extracted text
Console.WriteLine(result.Confidence)
Console.WriteLine(result.Text)
$vbLabelText   $csharpLabel

VS Code 调试控制台显示包含个人详细信息、国家/地区及编码字符串的 Passport 数据输出

  • Confidence:来自 ConfidenceOcrPassportResult 属性是一个浮点数,表示 OCR 统计准确率的置信度,该值是每个字符平均值的计算结果。 如果护照图像模糊或包含其他信息,该浮动值会降低。 1 表示信心最高,0 表示信心最低。 对于生产应用程序,请考虑实施 结果置信度阈值,以确保数据质量。
  • Text:来自 TextOcrPassportResult 属性包含从护照图像中提取的原始、未解析文本。 开发人员可将其用于单元测试,以验证提取的护照图像文本。 对于高级场景,您可以将结果导出为 hOCR 格式,以便进一步分析。

护照扫描应用程序的最佳实践

在生产环境中实施护照扫描时,还应考虑以下因素:

1.图像质量:确保输入图像符合最低质量标准。 Filter Wizard 可帮助优化图像以提高识别率。

2.性能:对于大批量处理,请实施 async 支持,并考虑批量处理多本护照。

3.安全性:由于护照数据是敏感数据,因此要确保妥善处理数据,并考虑与安全的文档管理系统集成。

4.验证:对提取的 MRZ 数据实施校验码验证,以确保准确性。 MRZ 格式包含多个校验码,可用于验证提取信息的完整性。

5.错误处理:针对护照图像可能损坏、光线不足或包含非标准格式的情况,实施强大的错误处理功能。

常见问题解答

如何用 C# 从图像中提取护照数据?

您可以使用 IronOCR 的 ReadPassport 方法提取护照数据。只需使用 OcrInput 加载护照图像,然后调用 ReadPassport() 即可在一行代码中获取包括姓名、护照号码、出生日期和有效期在内的结构化数据。

哪些护照信息可以自动提取?

IronOCR 的 ReadPassport 方法可从护照图像中提取姓名、国家、护照号码、姓氏、出生日期和到期日期。所有数据都以字符串形式返回到结构化的 PassportInfo 对象中。

读取护照 MRZ 数据需要复杂的设置吗?

无需复杂设置。IronOCR 提供简化的 API,只需一行代码即可提取护照 MRZ 数据,不像传统的 Tesseract 实现需要更多的配置。

护照阅读功能由什么技术提供?

IronOCR 在引擎盖下利用 Tesseract 5 的机器学习增强功能和先进的计算机视觉技术,自动定位和提取护照图像中的 MRZ(机器可读区)区域。

能否用于机场出入境系统?

是的,IronOCR 是机场移民和安全应用的理想选择,在这些应用中,工作人员每天都要处理大量的护照。它能可靠地提取对任务至关重要的旅客信息,确保高效的出入境流程。

IronOCR 是否支持多种语言?

IronOCR支持多种语言,使其成为全球应用程序中需要不同语言文本识别的多功能工具。

IronOCR可以集成到现有应用程序中吗?

IronOCR设计为易于使用C#集成到现有应用程序中,允许开发人员以最小的努力为他们的软件添加OCR功能。

使用IronOCR进行文档管理有什么好处?

使用IronOCR进行文档管理可以通过将扫描的文档转换为可搜索和可编辑文本来简化工作流程,减少手动数据输入的需要,提高文档可访问性。

IronOCR如何提高数据准确性?

IronOCR通过其高级识别算法和图像校正功能提高数据准确性,确保文本提取过程既可靠又精确。

IronOCR 有免费试用版吗?

是的,Iron Software 提供IronOCR 的免费试用,使用户在做出购买决定之前可以测试其功能和能力。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

审核者
Jeff Fritz
Jeffrey T. Fritz
首席项目经理 - .NET 社区团队
Jeff 也是 .NET 和 Visual Studio 团队的首席项目经理。他是 .NET Conf 虚拟会议系列的执行制片人,并主持“Fritz and Friends”直播节目,每周两次与观众一起谈论技术并编写代码。Jeff 撰写研讨会、演示文稿并计划包括 Microsoft Build、Microsoft Ignite、.NET Conf 和 Microsoft MVP 峰会在内的最大型微软开发者活动的内容。
准备开始了吗?
Nuget 下载 5,896,332 | 版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronOcr
运行示例 观看您的图像变成可搜索文本。