🛂 护照 OCR
0.75 IC每页
欢迎使用艾艾普护照 OCR API,这是由艾艾普科技有限公司开发的一款人工智能产品。我们的 API 旨在高精度、快速地自动识别和提取护照扫描图像中的信息。该系统特别专注于读取护照页面底部的机器可读区(MRZ),提取持有人姓名、国籍、出生日期等关键信息。
尝试演示!
入门指南
-
先决条件
- 艾艾普科技的 API 密钥
- 扫描的护照图像(个人信息页)
- 支持的文件格式:JPEG, JPG, PNG, PDF
- 最大文件大小:10MB
-
快速入门
- 快速处理(每张图像 1-2 秒)
- 高精度文本提取(95.51%)
- 支持多种文件格式
-
主要功能
- 从 TD3 类型 MRZ 中提取信息
- OCR 准确率评分和验证
- 以 base64 格式提取面部图像
- 支持多页 PDF 文档
- 处理旋转和倾斜的图像
- 对倾斜图像进行图像分割预处理
- 支持泰语和英语
-
安全与合规
- 符合 GDPR 和 PDPA 标准
- 处理后不保留数据
如何获取 API 密钥?
请访问 API 密钥管理 页面查看您现有的 API 密钥或申请新密钥。
示例
个人信息页

请求:
curl -X POST https://api.iapp.co.th/v3/store/ekyc/passport/v2 \
-H "apikey: YOUR_API_KEY" \
-F "file=@/path/to/passport.jpg"
响应:
{
"check_composite": "4",
"check_date_of_birth": "4",
"check_expiration_date": "4",
"check_number": "6",
"check_personal_number": "3",
"country": "THA",
"date_of_birth": "930710",
"expiration_date": "250304",
"method": "direct",
"mrz_type": "TD3",
"names": "MATHANIDA",
"nationality": "THA",
"number": "AC1062346",
"personal_number": "0012345678913",
"raw_text": "P<THAPOSHNASWADIWONG<<MATHANIDA<<<<<<<<<<<<<\nAC10623466THA9307104F25030440012345678913<34",
"sex": "F",
"surname": "POSHNASWADIWONG",
"type": "P",
"valid_composite": true,
"valid_date_of_birth": true,
"valid_expiration_date": true,
"valid_number": true,
"valid_personal_number": true,
"valid_score": 100,
"face": "/9j/4AAQSkZJRgABAQAAAQABAAD/..."
}
响应字段说明
| 字段 | 说明 | 格式 | 示例 |
|---|---|---|---|
| check_composite | 上下两条机器可读行的整体校验位 | 单个数字 | "4" |
| check_date_of_birth | 出生日期字段的校验位 | 单个数字 | "4" |
| check_expiration_date | 到期日期字段的校验位 | 单个数字 | "4" |
| check_number | 证件号码的校验位 | 单个数字 | "6" |
| check_personal_number | 个人号码的校验位 | 单个数字 | "3" |
| country | 签发护照的国家代码 | 3个字母 | "THA" |
| date_of_birth | 出生日期 | YYMMDD | "930710" |
| expiration_date | 证件到期日期 | YYMMDD | "250304" |
| method | 使用的读取方法 | 字符串 | "direct" |
| mrz_type | 机器可读区的类型 | 字符串 | "TD3" |
| names | 名字/名字 | 字符串 | "MATHANIDA" |
| nationality | 持有人国籍 | 3个字母 | "THA" |
| number | 护照号码 | 字符串 | "AC1062346" |
| personal_number | 身份证号码 | 字符串 | "0012345678913" |
| raw_text | 护照上的原始 MRZ 文本 | 字符串 | "P<THAPOSHNASWADIWONG..." |
| sex | 性别 | 单个字母 | "F" |
| surname | 姓氏/家名 | 字符串 | "POSHNASWADIWONG" |
| type | 证件类型 | 字符串 | "P" |
| valid_composite | 整体 MRZ 有效性检查 | 布尔值 | true |
| valid_date_of_birth | 出生日期校验位有效性 | 布尔值 | true |
| valid_expiration_date | 到期日期校验位有效性 | 布尔值 | true |
| valid_number | 证件号码校验位有效性 | 布尔值 | true |
| valid_personal_number | 个人号码校验位有效性 | 布尔值 | true |
| valid_score | 整体有效性评分 | 整数 0-100 | 100 |
| face | 提取的面部图像 | Base64 字符串 | "/9j/4AAQSkZJRgABA..." |
PDF 文件处理
处理 PDF 文件时,响应格式略有不同:
- 响应将是一个 JSON 数组,包含每页的结果
- 每个页面结果包括:
page:页码info:包含上述所有标准字段
process_time字段显示总处理时长
示例 PDF 响应结构:
[
{
"page": 1,
"info": {
"sex": "F",
"number": "AC1062346",
"expiration_date": "04/03/25",
"raw_text": "P<THAPOSHNASWADIWONG<<MATHANIDA<<<<<<<<<<<<<\nAC10623466THA9307104F25030440012345678913<34",
"personal_number": "0012345678913",
"surname": "POSHNASWADIWONG",
"nationality": "THA",
"date_of_birth": "10/07/93",
"names": "MATHANIDA",
"country": "THA",
"face": "iVBORw0...CYII=",
"inference": "3.888",
"file_name": "1676365480.3823211_thai_passport_page_1.png",
"message": "Success",
"status_code": 200
}
},
{
"process_time": "4.918s"
}
]
功能与能力
核心功能
- MRZ(机器可读区)文本提取
- 面部图像提取
- 多页 PDF 支持
- 自动图像方向校正
- 用于倾斜图像的图像分割
- 高精度验证检查
支持的字段
- 证件类型
- 签发国家
- 证件号码
- 持有人姓名
- 国籍
- 出生日期
- 性别
- 到期日期
- 个人号码
- 面部图像(base64)
- 原始 MRZ 文本
- 验证分数
API 端点
| 端点 | 方法 | 描述 | 费用 |
|---|---|---|---|
/v3/store/ekyc/passport/v2/passport-ocr/v2 (旧版) | POST | 增强型护照 OCR,准确率 95.51% - 提取 MRZ 数据和面部图像 | 每页 0.75 IC |
/v3/store/ekyc/passport/v1/passport-ocr (旧版) | POST | 护照 OCR - 提取 MRZ 数据和面部图像 | 每页 0.75 IC |
API 参考
护照 OCR 端点
1. 护照 OCR(版本 1)
POST /v3/store/ekyc/passport/v1
对护照个人信息页进行 OCR 并提取 MRZ 数据。
2. 护照 OCR(版本 2)
POST /v3/store/ekyc/passport/v2
增强版,准确率提高(95.51%)。对护照个人信息页进行 OCR 并提取 MRZ 数据。
请求头
| 名称 | 类型 | 必需 | 描述 |
|---|---|---|---|
| apikey | 字符串 | 是 | 您的 API 密钥 |
请求正文 (multipart/form-data)
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| file | 文件 | 是 | 图像文件 (JPG, PNG, PDF) |
| options | 字符串 | 否 | 为倾斜图像处理启用 "segmentation" |
代码示例
Curl
curl -X POST https://api.iapp.co.th/v3/store/ekyc/passport/front \
-H "apikey: YOUR_API_KEY" \
-F "file=@/path/to/file.jpg"
Python
import requests
url = "https://api.iapp.co.th/v3/store/ekyc/passport/v2"
headers = {
"apikey": "YOUR_API_KEY"
}
files = {
"file": open("passport.jpg", "rb")
}
response = requests.post(url, headers=headers, files=files)
print(response.json())
JavaScript
const axios = require("axios")
const FormData = require("form-data")
const fs = require("fs")
let data = new FormData()
data.append("file", fs.createReadStream("passport.jpg"))
let config = {
method: "post",
url: "https://api.iapp.co.th/v3/store/ekyc/passport/v2",
headers: {
apikey: "YOUR_API_KEY",
...data.getHeaders(),
},
data: data,
}
axios(config)
.then((response) => console.log(response.data))
.catch((error) => console.log(error))
PHP
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.iapp.co.th/v3/store/ekyc/passport/v2',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => array(
'apikey: YOUR_API_KEY'
),
CURLOPT_POSTFIELDS => array(
'file'=> new CURLFILE('passport.jpg')
)
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
Swift
import Foundation
let url = URL(string: "https://api.iapp.co.th/v3/store/ekyc/passport/v2")!
let boundary = "Boundary-\(UUID().uuidString)"
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("YOUR_API_KEY", forHTTPHeaderField: "apikey")
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let imageData = try! Data(contentsOf: URL(fileURLWithPath: "passport.jpg"))
var body = Data()
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"passport.jpg\"\r\n")
body.append("Content-Type: image/jpeg\r\n\r\n")
body.append(imageData)
body.append("\r\n--\(boundary)--\r\n")
let task = URLSession.shared.uploadTask(with: request, from: body) { data, response, error in
if let data = data {
let json = try? JSONSerialization.jsonObject(with: data)
print(json ?? "")
}
}
task.resume()
Kotlin
import okhttp3.*
import java.io.File
val client = OkHttpClient()
val file = File("passport.jpg")
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"file",
file.name,
RequestBody.create(MediaType.parse("image/jpeg"), file)
)
.build()
val request = Request.Builder()
.url("https://api.iapp.co.th/v3/store/ekyc/passport/v2")
.addHeader("apikey", "YOUR_API_KEY")
.post(requestBody)
.build()
client.newCall(request).execute().use { response ->
println(response.body()?.string())
}
Java
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.*;
public class PassportOCR {
public static void main(String[] args) throws IOException {
String boundary = "Boundary-" + System.currentTimeMillis();
URL url = new URL("https://api.iapp.co.th/v3/store/ekyc/passport/v2");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("apikey", "YOUR_API_KEY");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
try (OutputStream os = conn.getOutputStream()) {
byte[] fileBytes = Files.readAllBytes(Paths.get("passport.jpg"));
os.write(("--" + boundary + "\r\n").getBytes());
os.write(("Content-Disposition: form-data; name=\"file\"; filename=\"passport.jpg\"\r\n").getBytes());
os.write(("Content-Type: image/jpeg\r\n\r\n").getBytes());
os.write(fileBytes);
os.write(("\r\n--" + boundary + "--\r\n").getBytes());
}
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}
Dart
import 'package:http/http.dart' as http;
import 'dart:io';
Future<void> scanPassport() async {
var url = Uri.parse('https://api.iapp.co.th/v3/store/ekyc/passport/v2');
var request = http.MultipartRequest('POST', url);
request.headers['apikey'] = 'YOUR_API_KEY';
request.files.add(
await http.MultipartFile.fromPath(
'file',
'passport.jpg',
),
);
var response = await request.send();
var responseBody = await response.stream.bytesToString();
print(responseBody);
}
局限性与最佳实践
局限性
- 最大文件大小:10MB
- 支持格式:JPG, PNG, PDF
- 每张图像一个护照
- 需要清晰、聚焦的图像
最佳实践
- 确保良好的照明条件
- 避免眩光和反射
- 将护照置于画面中央
- 保持护照平整
- 使用高分辨率图像
- 对倾斜图像启用分割选项
准确性与性能
总体准确性
- 当前版本(2.0):95.51%
- 前一版本(1.1):88.86%
字段级准确性(版本 1.1)
- 姓名:81.93%
- 姓氏:90.26%
- 证件号码:84.03%
- 国籍:88.09%
- 面部检测:100%
处理速度
- 单张图像:1-2 秒
- PDF 文档:每页 2-3 秒
- 使用分割时需要额外时间
影响准确性的因素
- 图像质量
- 照明条件
- 证件位置
- 图像分辨率
- 证件状况
- 图像倾斜角度
历史
版本 2.0(2023 年 2 月)
- 总体准确性从 88.86% 提高到 95.51%
- 升级了整个 OCR 引擎
- 为倾斜图像添加了图像分割预处理
版本 1.1(2023 年 1 月)
- 添加了将面部提取为 base64
- 增加了对轻微倾斜图像的支持
- 添加了 PDF 文件支持
- 添加了多页 PDF 支持
版本 1.0(2022 年 2 月)
- 初始发布
- 支持使用 MRZ 的所有国家护照
- 基本图像格式支持(PNG, JPG, JPEG)
定价
| 操作 | 生产路径 | 旧版路径 | IC 成本 | 单位 | 本地部署 |
|---|---|---|---|---|---|
| 护照 OCR(版本 1) | /v3/store/ekyc/passport/v1 | /passport-ocr | 0.75 IC | 每次请求 | 联系我们 |
| 护照 OCR(版本 2) | /v3/store/ekyc/passport/v2 | /passport-ocr/v2 | 0.75 IC | 每次请求 | 联系我们 |
