图片OCR识别

本文介绍了如何使用Python SDK图片OCR接口,识别图片中的文字或卡证信息。

功能描述

通用OCR除了能够识别普通图片中的文字,还能识别结构化的卡证上的文字。关于参数的详细说明,请参见图片OCR检测API文档

前提条件

提交图片同步检测任务

接口

描述

支持的Region

ImageSyncScanRequest

提交图片OCR同步识别任务,对图片中的文字进行识别(scene=ocr)。

  • cn-shanghai

  • cn-beijing

  • cn-shenzhen

  • ap-southeast-1

示例代码

  • 传图片URL进行检测

    #coding=utf-8
    # 以下代码将调用OCR图片检测接口并实时返回检测结果。
    from aliyunsdkcore import client
    from aliyunsdkgreen.request.v20180509 import ImageSyncScanRequest
    from aliyunsdkgreenextension.request.extension import HttpContentHelper
    import json
    import uuid
    
    # 注意:此处实例化的client尽可能重复使用,提升检测性能。避免重复建立连接。
    # 常见获取环境变量方式:
    # 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
    # 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
    clt = client.AcsClient("建议从环境变量中获取RAM用户AccessKey ID", "建议从环境变量中获取RAM用户AccessKey Secret", "cn-shanghai")
    # 每次请求时需要新建request,请勿复用request对象。
    request = ImageSyncScanRequest.ImageSyncScanRequest()
    request.set_accept_format('JSON')
    task = {"dataId": str(uuid.uuid1()),
             "url":"https://example.com/test.jpg"
            }
    
    # 卡证识别的检测类型通过extras参数设置,具体请参见API文档。
    extras = {"card" : "id-card-front"}
    print(task)
    # 设置待检测的图片,一张图片对应一个检测任务。
    # 多张图片同时检测时,处理时间由最后一张处理完的图片决定。
    # 通常情况下批量检测的平均响应时间比单任务检测长,一次批量提交的图片数越多,响应时间被拉长的概率越高。
    # 代码中以单张图片检测作为示例,如果需要批量检测多张图片,请自行构建多个任务。
    # OCR检测按照实际检测的图片张数*检测的卡证类型单价计费。
    request.set_content(HttpContentHelper.toValue({"tasks": [task],
                                                   "scenes": ["ocr"],
                                                   "extras": extras
                                                   }))
    response = clt.do_action_with_exception(request)
    print(response)
    result = json.loads(response)
    if 200 == result["code"]:
        taskResults = result["data"]
        for taskResult in taskResults:
            if (200 == taskResult["code"]):
                sceneResults = taskResult["results"]
                print(sceneResults)
  • 传本地图片文件进行检测

    #coding=utf-8
    # 以下代码将调用OCR图片检测接口并实时返回检测结果。
    from aliyunsdkcore import client
    from aliyunsdkgreen.request.v20180509 import ImageSyncScanRequest
    from aliyunsdkgreenextension.request.extension import HttpContentHelper
    from aliyunsdkgreenextension.request.extension import ClientUploader
    import json
    import uuid
    
    # 设置编码规则,以便支持本地中文路径。
    # Python2中添加以下内容,Python3无需添加。
    if sys.version_info[0] == 2:
        reload(sys)
        sys.setdefaultencoding('utf-8')
    
    # 注意:此处实例化的client尽可能重复使用,提升检测性能。避免重复建立连接。
    # 常见获取环境变量方式:
    # 获取RAM用户AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
    # 获取RAM用户AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
    clt = client.AcsClient("建议从环境变量中获取RAM用户AccessKey ID", "建议从环境变量中获取RAM用户AccessKey Secret", "cn-shanghai")
    # 每次请求时需要新建request,请勿复用request对象。
    request = ImageSyncScanRequest.ImageSyncScanRequest()
    request.set_accept_format('JSON')
    
    # 上传本地文件到服务端。请修改成您的本地文件路径。
    uploader = ClientUploader.getImageClientUploader(clt)
    url = uploader.uploadFile('d:/test/test.jpg')
    
    task = {"dataId": str(uuid.uuid1()),
             "url":url
            }
    # 卡证识别的检测类型通过extras参数设置,具体请参见API文档。
    extras = {"card" : "id-card-front"}
    print(task)
    # 设置待检测的图片,一张图片对应一个检测任务。
    # 多张图片同时检测时,处理时间由最后一张处理完的图片决定。
    # 通常情况下批量检测的平均响应时间比单任务检测长,一次批量提交的图片数越多,响应时间被拉长的概率越高。
    # 代码中以单张图片检测作为示例,如果需要批量检测多张图片,请自行构建多个任务。
    # OCR检测按照实际检测的图片张数*检测的卡证类型单价计费。
    request.set_content(HttpContentHelper.toValue({"tasks": [task],
                                                   "scenes": ["ocr"],
                                                   "extras": extras
                                                   }))
    response = clt.do_action_with_exception(request)
    print(response)
    result = json.loads(response)
    if 200 == result["code"]:
        taskResults = result["data"]
        for taskResult in taskResults:
            if (200 == taskResult["code"]):
                sceneResults = taskResult["results"]
                print(sceneResults)
  • 传图片二进制字节组数据进行检测

    #coding=utf-8
    # 以下代码将调用OCR图片检测接口并实时返回检测结果。
    from aliyunsdkcore import client
    from aliyunsdkgreen.request.v20180509 import ImageSyncScanRequest
    from aliyunsdkgreenextension.request.extension import HttpContentHelper
    from aliyunsdkgreenextension.request.extension import ClientUploader
    import json
    import uuid
    
    # 设置编码规则,以便支持本地中文路径。
    # Python2中添加以下内容,Python3无需添加。
    if sys.version_info[0] == 2:
        reload(sys)
        sys.setdefaultencoding('utf-8')
    
    # 请使用您的AccessKey信息。
    clt = client.AcsClient("yourAccessKeyId", "yourAccessKeySecret","cn-shanghai")
    # 每次请求时需要新建request,请勿复用request对象。
    request = ImageSyncScanRequest.ImageSyncScanRequest()
    request.set_accept_format('JSON')
    
    # 读取本地文件作为二进制数据,模拟二进制数据检测。
    # 请修改成您的本地文件路径。
    f = open('d:/test/test.jpg', "rb+")
    imageBytes = f.read()
    f.close()
    
    # 上传二进制文件到服务端。
    uploader = ClientUploader.getImageClientUploader(clt)
    url = uploader.uploadBytes(imageBytes)
    task = {"dataId": str(uuid.uuid1()),
             "url":url
            }
    
    # 卡证识别的检测类型通过extras参数设置,具体请参见API文档。
    extras = {"card" : "id-card-front"}
    print(task)
    # 设置待检测的图片,一张图片对应一个检测任务。
    # 多张图片同时检测时,处理时间由最后一张处理完的图片决定。
    # 通常情况下批量检测的平均响应时间比单任务检测长,一次批量提交的图片数越多,响应时间被拉长的概率越高。
    # 代码中以单张图片检测作为示例,如果需要批量检测多张图片,请自行构建多个任务。
    # OCR检测按照实际检测的图片张数*检测的卡证类型单价计费。
    request.set_content(HttpContentHelper.toValue({"tasks": [task],
                                                   "scenes": ["ocr"],
                                                   "extras": extras
                                                   }))
    response = clt.do_action_with_exception(request)
    print(response)
    result = json.loads(response)
    if 200 == result["code"]:
        taskResults = result["data"]
        for taskResult in taskResults:
            if (200 == taskResult["code"]):
                sceneResults = taskResult["results"]
                print(sceneResults)