在很多业务系统中,身份证 OCR 识别已经成为一个常见能力,例如:
- 实名认证系统
- 金融开户
- 招聘平台身份验证
- 政务系统信息录入
- 自动化数据录入
如果完全依赖人工录入身份证信息,不仅效率低,还容易出现输入错误。因此越来越多系统会通过 OCR 技术自动识别身份证信息。
本文从开发者角度出发,介绍 身份证 OCR 的基本原理以及如何快速完成 API 接入。
一、身份证 OCR 的常见应用场景
在实际业务中,身份证 OCR 常用于以下场景。
实名认证
用户上传身份证照片后,系统自动识别:
- 姓名
- 身份证号
- 地址
- 出生日期 并用于实名认证流程。
表单自动填写
例如注册或开户流程:
用户上传身份证照片 → 系统自动提取信息 → 自动填写表单字段。
这样可以减少用户输入,提高注册效率。
数据录入自动化
在一些业务系统中,需要录入大量身份证信息。通过 OCR 技术可以实现:
- 自动识别身份证信息
- 减少人工录入工作
- 提高数据录入效率
二、身份证 OCR 的技术流程
一个典型的身份证 OCR 识别流程通常包括以下步骤:
身份证图片
↓
图像预处理
↓
文本检测
↓
文本识别
↓
字段结构化
↓
返回识别结果
其中 字段结构化 是非常重要的一步。
系统不仅需要识别文字,还需要把信息整理为结构化数据,例如:
- 姓名
- 性别
- 民族
- 出生日期
- 地址
- 身份证号码
- 人像图片提取与优化
三、身份证 OCR API 接入流程
对于开发者来说,通过 OCR API 接入通常是最简单的方式。
一个基本接入流程如下。
Step 1:上传身份证图片
前端可以使用普通文件上传组件:
<input type="file" />
用户选择身份证照片后上传到服务器。
Step 2:调用 OCR 接口
后端获取图片后,可以调用 OCR 接口进行识别。
下面是一个简单的示例代码结构。详细示例可以参考网址:market.shiliuai.com/doc/id-card…
Python 示例
# 示例代码:调用 OCR 接口识别身份证信息
# -*- coding: utf-8 -*-
import requests
import base64
import json
# 请求接口
URL = "https://ocr-api.shiliuai.com/api/id_card_ocr/v2"
# 图片转base64
def get_base64(file_path):
with open(file_path, 'rb') as f:
data = f.read()
b64 = base64.b64encode(data).decode('utf8')
return b64
def demo(appcode, file_path):
# 请求头
headers = {
'Authorization': 'APPCODE %s' % appcode,
'Content-Type': 'application/json'
}
# 请求体
b64 = get_base64(file_path)
data = {"image_base64": b64}
# 请求
response = requests.post(url=URL, headers=headers, json=data)
content = json.loads(response.content)
print(content)
if __name__=="__main__":
appcode = "你的APPCODE"
file_path = "本地图片路径"
demo(appcode, file_path)
Java 示例
// 示例代码:调用 OCR 接口
public class OcrDemo {
public static void main(String[] args) {
System.out.println("调用 OCR 接口识别身份证信息");
}
}
PHP 示例
<?php
// 示例代码
echo "调用 OCR 接口识别身份证信息";
?>
// 图片转base64
function get_base64($path){
if($fp = fopen($path, "rb", 0)) {
$binary = fread($fp, filesize($path));
fclose($fp);
$b64 = base64_encode($binary);
}else{
$b64="";
printf("%s 文件不存在", $path);
}
return $b64;
}
// 请求接口
$url = "https://ocr-api.shiliuai.com/api/id_card_ocr/v2";
$appcode = "你的appcode";
$img_path = "图片路径";
$method = "POST";
// 请求头
$headers = array();
array_push($headers, "Authorization:APPCODE " . $appcode);
array_push($headers, "Content-Type:application/json");
// 请求体
$b64 = get_base64($img_path);
$data = array(
"image_base64" => $b64
);
$post_data = json_encode($data);
// 请求
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
$result = curl_exec($curl);
var_dump($result);
C# 示例
// 示例代码
Console.WriteLine("调用 OCR 接口识别身份证信息");
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MyCSharpApp
{
public class Program
{
public static string GetBase64(string path)
{
string b64 = "";
try
{
// 读取文件内容
byte[] content = File.ReadAllBytes(path);
// 转换为Base64
b64 = Convert.ToBase64String(content);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return b64;
}
public static async Task Main(string[] args)
{
string url = "https://ocr-api.shiliuai.com/api/id_card_ocr/v2"; // 请求接口
string appcode = "你的APPCODE";
string imgFile = "本地图片路径";
// 设置请求头
Dictionary headers = new Dictionary
{
{ "Authorization", "APPCODE " + appcode }
};
JObject requestObj = new JObject();
requestObj["image_base64"] = GetBase64(imgFile);
string body = requestObj.ToString();
try
{
using (HttpClient client = new HttpClient())
{
// 设置请求头
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
// 创建请求内容
StringContent content = new StringContent(body, Encoding.UTF8, "application/json");
// 发送请求并获取响应
HttpResponseMessage response = await client.PostAsync(url, content);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine($"Http code: {(int)response.StatusCode}");
return;
}
// 读取响应内容
string responseContent = await response.Content.ReadAsStringAsync();
JObject resObj = JObject.Parse(responseContent);
Console.WriteLine(resObj.ToString(Formatting.Indented));
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
四、OCR 返回结果示例
身份证 OCR 通常会返回结构化数据,例如:
{
"code": 200,
"msg": "success",
"msg_cn": "成功",
"success": true,
"image_id": "xxxx",
"request_id": "req_xxxx",
"data": {
"is_front": true,
"complete_score": 0.98,
"is_complete": true,
"clear_score": 0.92,
"is_clear": true,
"name": "张三",
"sex": "男",
"ethnicity": "汉",
"birthDate": "1990年01月01日",
"address": "北京市朝阳区XXX",
"idNumber": "110101199001011234"
}
}
开发者可以根据返回字段:
- 自动填充表单
- 存储数据库
- 进行身份校验
五、开发中常见问题
在实际项目中,身份证 OCR 识别可能会受到一些因素影响。
图片模糊
如果图片分辨率过低或拍摄不清晰,可能影响识别准确率。
建议:
- 上传清晰照片
- 避免截图压缩
- 保证光线充足
图片倾斜
身份证拍摄角度过大时,可能会影响识别。
部分 OCR 系统会自动进行倾斜校正。
遮挡问题
如果身份证被手指遮挡,可能导致:
- 地址识别不完整
- 身份证号识别错误
六、总结
身份证 OCR 是许多业务系统中的基础能力之一。
通过 OCR 技术可以实现:
- 自动识别身份证信息
- 自动填写表单
- 提高数据录入效率
对于开发者来说,通过 API 接入可以大大减少算法开发成本,更快完成系统功能集成。
在实际项目中,建议结合业务需求选择合适的 OCR 方案,并做好图片质量控制,以获得更好的识别效果。