You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取解码印度Aadhaar卡安全QR码 解决Python库解码报错问题

印度Aadhaar身份证安全QR码解码解决方案

报错根因

  • pyaadhaar库报错:该库长期未维护,存在两处明显问题:一是源码拼写错误,模块名decode被错写为deocde;二是类型适配错误,对字符串类型的base10编码值直接调用仅整数支持的to_bytes方法,触发属性报错。
  • aadhaar-py库报错:QR码识别环节返回的原始数据不完整,要么是识别工具截断了超长的编码数值,要么是转码过程丢失了精度,导致解压时无法通过校验。

可行解决方案

步骤1:更换QR码识别逻辑

弃用pyaadhaar自带的QR识别方法,改用opencv+pyzbar组合提取原始完整的QR码数据,避免内容截断:

import cv2
from pyzbar.pyzbar import decode

def extract_qr_raw(img_path):
    img = cv2.imread(img_path)
    qr_result = decode(img)
    if not qr_result:
        return None
    # 直接提取原始字符串后转整数,避免编码损失
    raw_str = qr_result[0].data.decode('utf-8').strip()
    return int(raw_str)

步骤2:使用修复后的解码逻辑

不用原生的问题库,直接在本地实现修复后的安全QR码解码逻辑,规避原有库的bug:

import zlib

class SecureAadhaarQrDecoder:
    def __init__(self, qr_int_val):
        # 先转整数再转字节,修复原pyaadhaar的类型错误
        byte_arr = qr_int_val.to_bytes(5000, 'big').lstrip(b'\x00')
        # 按官方规范解压数据
        decompressed_data = zlib.decompress(byte_arr, wbits=16+zlib.MAX_WBITS)
        self.raw_data = decompressed_data.decode('utf-8')
    
    def get_aadhaar_number(self):
        # 按官方数据分段规则,第3个分段即为12位Aadhaar号码
        data_segments = self.raw_data.split(',')
        return data_segments[2] if len(data_segments) >=3 else None

步骤3:组合调用测试

if __name__ == "__main__":
    import sys
    if len(sys.argv) < 2:
        print("请传入身份证图片路径")
        exit()
    qr_val = extract_qr_raw(sys.argv[1])
    if not qr_val:
        print("未检测到有效QR码")
    else:
        try:
            decoder = SecureAadhaarQrDecoder(qr_val)
            aadhaar_num = decoder.get_aadhaar_number()
            print(f"提取到的12位Aadhaar号码为:{aadhaar_num}")
        except Exception as e:
            print(f"解码失败:{str(e)}")

备用方案

如果QR码解码成功率低,可以搭配OCR+校验规则方案兜底:

  • 定位身份证上的12位号码区域,用Tesseract等OCR工具识别结果
  • 用Aadhaar号码的Verhoeff校验算法过滤识别结果,排除错误识别的内容

内容的提问来源于stack exchange,提问作者Piyush Makhija

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:06:03