身份证 OCR 识别 API 实战:自动提取姓名、身份证号、地址以及人像图片和优化

0 阅读4分钟

在很多业务系统中,身份证 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…

image.png


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 方案,并做好图片质量控制,以获得更好的识别效果。