眼神ABIS平台API:车辆区域检测
对一张输入图像进行区域车辆检测,检测是否有车辆在图像中,识别返回各车辆矩形框坐标信息;支持对图像中多个指定识别区域,作车辆在区域内外的识别检测。可应用于违章停车监测、智慧园区和布控追逃等场景。
功能描述
对一张输入图像进行区域车辆检测,检测是否有车辆在图像中,识别返回各车辆矩形框坐标信息;支持对图像中多个指定识别区域,作车辆在区域内外的识别检测。可应用于违章停车监测、智慧园区和布控追逃等场景。
接口调用
对输入图像进行车辆检测,检测是否有车辆在图像中,识别返回各车辆矩形框坐标信息;支持对图像中多个指定识别区域,作车辆在区域内外的识别检测。将检测结果以Json格式返回给调用者。
- 请求方法
http://${IP}:${Port}/v1/detect/attribute/vehicle?code=VEHICLE_AREA_DETECT
- Header参数
Key | Value | 请求或响应 |
---|---|---|
Content-type | application/json | 存在于请求和响应中,不可为空 |
Abis-Request-Sequence | 请求流水号 | 存在于请求和响应中,请求中可以为空,如为空则由服务自动生成一个流水号 |
Authorization | 接口鉴权标识 | 若使用ABIS云平台的接口API,则需要去 ABIS门户控制台-基本资料-鉴权密钥 中获取 立即获取 |
- Body参数
Json Path | 类型 | 必填 | 含义 | 注意事项 |
---|---|---|---|---|
$.image | String | 是 | Base64 编码的图像数据 | |
$.areas[*].name | String | 否 | 指定区域名称 | 检测区域框内外是否有车辆,使用本功能需要至少指定1个区域 |
$.areas[*].x | Int[] | 否 | 对应区域x坐标数组 | 每个区域至少指定3个坐标点 |
$.areas[*].y | Int[] | 否 | 对应区域y坐标数组 | 每个区域至少指定3个坐标点 |
$.detectionOption.rect | Boolean | 否 | 是否返回人体矩形框 | 左上,宽高 |
对应示例:
{
"image": "/9j/4AAQSkZJRgABARRQB//2Q==",
"detectionOption": {
"rect": true
},
"areas": [
{
"name": "area1",
"x": [45,308,45,308],
"y": [260,260,960,960]
}
]
}
- 返回参数
Json Path | 类型 | 含义 | 注意事项 |
---|---|---|---|
$.response.status | String | 返回状态 | 2000 表示正常 |
$.response.content | String | 状态信息 | 状态的详细描述信息 |
$.reply.bodyAttributes[*].bodyId | int | 车辆id | |
$.reply.bodyAttributes[*].rect | int[] | 对应id的车辆矩形框 | 左上、宽高 |
$.reply.areaBodies[*].name | String | 区域名称 | 入参areas不为空时返回 |
$.reply.areaBodies[*].in | int[] | 对应区域内的车辆id列表 | |
$.reply.areaBodies[*].out | int[] | 对应区域外的车辆id列表 |
对应示例:
{
"reply": {
"vehicleAttributes": [
{
"rect": "[104, 54, 282, 290]",
"vehicleId": "0"
},
{
"rect": "[377, 126, 75, 47]",
"vehicleId": "1"
},
{
"rect": "[72, 121, 37, 27]",
"vehicleId": "2"
},
{
"rect": "[429, 131, 70, 69]",
"vehicleId": "3"
},
{
"rect": "[23, 121, 62, 34]",
"vehicleId": "4"
}
],
"areaVehicles": [
{
"name": "area1",
"in": [0],
"out": [1,2,3,4]
}
]
},
"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;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 车辆区域检测
*
* @author zhupy
* @date 2023/06/13
*/
public class DetectVehicleAreaDemo {
/**
* 连接超时时间
*/
private static int connTimeOut = 60 * 1000;
/**
* 请求原子能力的URL(实际开发调试中,可以换成自己部署的abis服务)
*/
private static final String url = "https://www.abis.cn/v1/detect/attribute/vehicle?code=VEHICLE_AREA_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);
// 组装数据结构
DetectVehicleAreaDemo demo = new DetectVehicleAreaDemo();
AreaDetectParam param = demo.new AreaDetectParam();
param.setImage(imageBase64);
List<Area> areas = new ArrayList<>();
Integer[] xArrays = new Integer[] {45, 308, 45, 308};
Integer[] yArrays = new Integer[] {260, 260, 360, 360};
List<Integer> x = Arrays.asList(xArrays);
List<Integer> y = Arrays.asList(yArrays);
areas.add(demo.new Area("area1", x, y));
param.setAreas(areas);
param.setDetectionOption(demo.new DetectionOption(true));
// 发送Http请求
String response = doPostJson(url, JSON.toJSONString(param));
System.out.println("响应数据:");
System.out.println(response);
}
@Data
public class AreaDetectParam {
/**
* 图像
*/
private String image;
/**
* 区域信息
*/
private List<Area> areas;
private DetectionOption detectionOption;
}
@Data
@AllArgsConstructor
public class Area {
/**
* 区域名称
*/
private String name;
/**
* 区域x坐标
*/
private List<Integer> x;
/**
* 区域y坐标
*/
private List<Integer> y;
}
@Data
@AllArgsConstructor
public class DetectionOption {
/**
* 是否返回矩阵框
*/
private Boolean rect;
}
/**
* 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();
}
}
}
更多推荐
所有评论(0)