功能描述

对一张包含车牌的图像进行车牌属性检测,识别对应的车牌属性信息,包括车牌号、车牌颜色、车牌类型(单/双层)、各类型车牌的统计数量、各车牌矩形框坐标点等信息。可基于图像分析结果作后续处理。

接口调用

对一张包含车牌的图像进行车牌属性检测,识别对应的车牌属性信息,包括车牌号、车牌颜色、车牌类型(单/双层)、各类型车牌的统计数量、各车牌矩形框坐标点等信息。将检测结果以Json格式返回给调用者。

  • 请求方法

http://${IP}:${Port}/v1/detect/attribute/licensePlate?code=LICENSEPLATE_DETECT

  • Header参数
Key Value 请求或响应
Content-type application/json 存在于请求和响应中,不可为空
Abis-Request-Sequence 请求流水号 存在于请求和响应中,请求中可以为空,如为空则由服务自动生成一个流水号
Authorization 接口鉴权标识 若使用ABIS云平台的接口API,则需要去 ABIS门户控制台-基本资料-鉴权密钥 中获取 立即获取
  • Body参数
Json Path 类型 必填 含义 注意事项
$.image.content String Base64 编码的图像数据 需要传入人脸图像
$.detectionOption.rect Boolean 是否检测车牌矩形框 左上、宽高
$.detectionOption.landmark Boolean 是否检测车牌坐标点  
$.detectionOption.licensePlateNum Boolean 是否检测车牌号  
$.detectionOption.color Boolean 是否检测车牌颜色  
$.detectionOption.type Boolean 是否检测车牌类型 单/双层
$.detectionOption.count Boolean 是否分类统计车牌数量  

对应示例:

{
  detectionOption:{
  color:true
  count:true
  landmark:true
  licensePlateNum:true
  rect:true
  type:true
  },
  image:"/9j/4AAQSkZJRgABARRQB//2Q=="
}

  • 返回参数
Json Path 类型 含义 注意事项
$.response.status String 返回状态 2000 表示正常
$.response.content String 状态信息 状态的详细描述信息
$.reply.count.oneLayer int 单层车牌数量  
$.reply.count.twoLayer int 双层车牌数量  
$.reply.licensePlateAttributes[*].rect int[] 车牌矩形框 左上、宽高
$.reply.licensePlateAttributes[*].landmark int[] 车牌坐标点  
$.reply.licensePlateAttributes[*].color String 车牌颜色 black/blue/green/white/yellow
$.reply.licensePlateAttributes[*].type int 车牌类型 0:单层车牌概率分;
1:双层车牌概率分
$.reply.licensePlateAttributes[*].licensePlateNum String 车牌号  

对应示例:
{
  "reply": {
    "licensePlateAttributes": [
      {
        "type": "1",
        "color": "yellow",
        "rect": "[211, 230, 75, 40]",
        "landmark": "[212.70825, 230.63974, 285.93362, 231.63837, 285.38834, 271.32825, 211.90007, 270.0945]",
        "licensePlateNum": "京EB5888"
      }
    ],
    "count": {
      "twoLayer": 1,
      "oneLayer": 0
    }
  },
  "response": {
    "status": "2000"
  }
}

错误码

错误码 说明 解决方案
2000 成功  
-2001 未知的异常 请查看返回的 content 中内容
-2020 传入图片内容为空 请确定是否传入了图片
-2021 加载图片失败 传入的不是有效图片或不支持的图片格式,支持的图片格式包括:BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
-2100 未检测到车辆 请确保图片是正面朝上的车辆图片,且车辆清晰,图片背景没有反光
-2101 检测人脸属性异常 详情请查看后台日志
-2102 接口调用超时 可能是请求量过大,或者可能是服务器上cpu被其他应用占用过大
-2108 文件读取失败 请查看 content 字段返回的异常信息
-2109 算法调用图像质量检测接口失败 请查看算法错误码文档
-2119 车辆属性检测的条件参数未设置 请输入需要检测的车辆属性参数
-2604 传入的参数为空 请根据content内容提示检测入参

注意事项

1、对图像要求
支持的图片格式:BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
对比度、亮度适中;
尽量不要有较多背景,尽量选择浅色、纯色背景;
图像尽量避免反光和黑影;
图像清晰,避免图像模糊不清; 图像分辨率不宜过高,一方面造成图片过大,不利于传输,一方面分辨率过高也会影响识别率。
2、服务需要联网调用
由于当前服务基于 http 技术实现,用户调用服务前请确保您的设备可以连通服务器,并保证一定的带宽。否则图像数据网络传输较慢,会引起较长时间等待。
3、Base64编码
若接口涉及到数据需要进行base64编码,请引用commons-codec-1.13.jar对图片进行base64编码:base64.encodeBase64String(byteData);

示例代码(Java)

import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 车牌识别
 *
 * @author zhupy
 * @date 2023/06/13
 */
public class DetectLicenseplateDemo {
    /**
     * 连接超时时间
     */
    private static int connTimeOut = 60 * 1000;
    /**
     * 请求原子能力的URL(实际开发调试中,可以换成自己部署的abis服务)
     */
    private static final String url = "https://www.abis.cn/v1/detect/attribute/licensePlate?code=LICENSEPLATE_DETECT";
    /**
     * 待检测图片的本地路径
     */
    private static String imgPath = System.getProperty("user.dir") + File.separator + "image";

    public static void main(String[] args) {
        // 读取本地图片
        File imageFile = new File(imgPath + File.separator + "image.jpg");
        String imageBase64 = encodeImgageToBase64(imageFile);
        // 组装数据结构
        DetectLicenseplateDemo demo = new DetectLicenseplateDemo();
        LicenseplateParam param = demo.new LicenseplateParam();
        param.setImage(imageBase64);
        param.setDetectionOption(demo.new DetectionOption(true, true, true, true, true));
        // 发送Http请求
        String response = doPostJson(url, JSON.toJSONString(param));
        System.out.println("响应数据:");
        System.out.println(response);
    }

    @Data
    public class LicenseplateParam {
        private String image;
        private DetectionOption detectionOption;
    }

    @Data
    @AllArgsConstructor
    public class DetectionOption {

        /**
         * 是否检测车牌矩阵框
         */
        private Boolean rect;
        /**
         * 是否检测车牌检测点
         */
        private Boolean landmark;
        /**
         * 是否检测车牌号
         */
        private Boolean licensePlateNum;
        /**
         * 是否检测车牌颜色
         */
        private Boolean color;
        /**
         * 是否检测车牌类型
         */
        private Boolean type;
    }


    /**
     * File文件转base64格式
     *
     * @param file
     * @return string
     */
    public static String encodeImgageToBase64(File file) {

        String stringBase64 = null;
        try {
            if (file != null && file.exists()) {
                FileInputStream fis = new FileInputStream(file);
                try {
                    byte[] fileBytes = new byte[fis.available()];
                    fis.read(fileBytes);
                    stringBase64 = Base64.encodeBase64String(fileBytes);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    fis.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringBase64;
    }

    /**
     * PostJson请求
     *
     * @param url
     * @param json
     * @return
     */
    public static String doPostJson(String url, String json) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        // TODO 此处token的值需要修改,从网页端获取,格式为:Bearer token
        String token =
            "Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImYxYzU4MGZhLTUyZjctNDE4OS04MGE4LWQ4ZjYyYWFiMmEwMCJ9.ZhWKCU0Xr7O8-cTv34FkkZUrb28WoBzPmOAnbvIrjB65kW6DUso-KB8WgAagSvYHF5McWS8Bl2_NsrikYFDxpw";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("Authorization", token);
            /** 设置超时时间 */
            RequestConfig requestConfig =
                RequestConfig.custom().setConnectionRequestTimeout(connTimeOut).setSocketTimeout(connTimeOut)
                    .setConnectTimeout(connTimeOut).build();
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            httpPost.setConfig(requestConfig);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            finallyClose(httpClient, response);
        }
        return resultString;
    }

    /**
     * 关闭和释放
     *
     * @param httpClient
     * @param response
     */
    private static void finallyClose(CloseableHttpClient httpClient, CloseableHttpResponse response) {
        try {
            if (response != null) {
                response.close();
            }
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

更多推荐