以下是基于WPF和腾讯OCR的身份证批量识别与导出Excel的完整方案:
一、应用场景
企业人事管理
新员工入职时需批量录入数百份身份证信息,传统手动录入易出错且耗时。通过OCR自动提取姓名、身份证号等字段,生成结构化Excel表格(如员工ID_姓名_身份证号.xlsx
),效率提升10倍以上。政务档案数字化
社区需将纸质身份证档案电子化。扫描后通过多区域OCR识别,自动校验身份证号有效性(如18位校验码),输出带户籍地址的表格,准确率可达98%。金融开户审核
银行需核验客户身份证真实性。系统自动提取证件信息并与公安系统接口比对,标记异常数据(如过期证件),减少人工复核工作量。
二、WPF界面设计
<Grid>
<!-- 文件选择区 -->
<StackPanel Orientation="Horizontal" Margin="10">
<Button Content="添加图片" Click="BtnAddImages_Click"/>
<Button Content="添加文件夹" Click="BtnAddFolder_Click"/>
</StackPanel>
<!-- 预览区 -->
<DataGrid x:Name="dgResults" AutoGenerateColumns="False" Margin="10">
<DataGrid.Columns>
<DataGridTextColumn Header="序号" Binding="{Binding Index}"/>
<DataGridTextColumn Header="姓名" Binding="{Binding Name}"/>
<DataGridTextColumn Header="身份证号" Binding="{Binding IdNumber}" Width="200"/>
<DataGridTemplateColumn Header="预览">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Thumbnail}" Height="40"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<!-- 操作区 -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="10">
<Button Content="开始识别" Click="BtnRecognize_Click"/>
<Button Content="导出Excel" Click="BtnExport_Click"/>
</StackPanel>
</Grid>
三、核心代码实现
1. 腾讯OCR调用
// 需安装TencentCloud.SDK.OCR NuGet包
public async Task<IdCardInfo> RecognizeIdCard(string imagePath)
{
var cred = new Credential("Your_SecretId", "Your_SecretKey");
var client = new OcrClient(cred, "ap-guangzhou");
var req = new IDCardOCRRequest {
ImageBase64 = Convert.ToBase64String(File.ReadAllBytes(imagePath)),
CardSide = "FRONT" // 识别正面
};
var resp = await client.IDCardOCR(req);
return new IdCardInfo {
Name = resp.Name,
IdNumber = resp.IdNum,
Address = resp.Address,
// 其他字段...
};
}
2. Excel导出(使用ClosedXML)
public void ExportToExcel(List<IdCardInfo> data, string outputPath)
{
using (var workbook = new XLWorkbook())
{
var ws = workbook.AddWorksheet("身份证数据");
// 表头
ws.Cell(1, 1).Value = "序号";
ws.Cell(1, 2).Value = "姓名";
ws.Cell(1, 3).Value = "身份证号";
// 其他字段...
// 填充数据
for (int i = 0; i < data.Count; i++)
{
ws.Cell(i+2, 1).Value = i+1;
ws.Cell(i+2, 2).Value = data[i].Name;
ws.Cell(i+2, 3).Value = data[i].IdNumber;
// 其他字段...
}
workbook.SaveAs(outputPath);
}
}
四、优化建议
图像预处理
- 使用OpenCV进行透视矫正(
cv2.warpPerspective
)和去噪(cv2.fastNlMeansDenoising
) - 分辨率建议≥300dpi,避免反光/倾斜
- 使用OpenCV进行透视矫正(
错误处理
try { // OCR调用代码 } catch (TencentCloudSDKException ex) { Log($"识别失败: {ex.Message}"); // 自动重试或加入待处理队列 }
性能提升
- 多线程处理:
Parallel.ForEach
并发调用OCR接口 - 腾讯API批量模式:单次请求支持最多20张图片
- 多线程处理:
安全增强
- 身份证号脱敏存储(如
110101******1234
) - 使用HTTPS传输加密数据
- 身份证号脱敏存储(如
五、输出示例
序号 | 姓名 | 身份证号 | 地址 |
---|---|---|---|
1 | 张三 | 110101199001011234 | 北京市东城区... |
2 | 李四 | 31011519850515222X | 上海市浦东新区... |