眼神ABIS平台 人脸1:1 比对API

功能描述

传入两张含有人脸特征的图像数据,服务对两张人脸图像中的生物特征进行比对,返回比对分数,分数越高表示越相似。

接口调用

本节将对人脸信息比对服务进行阐述。由于实际所使用到的编程语言较多,此文档不会一一涉及。本章中将只就 Java 语言如何调用识别服务接口进行代码示例讲解。其它语言如何进行调用,用户可参照接口调用例程。

  • 请求方法

http://${IP}:${Port}/v1/comparison/image?code=PERSON_FACE_MATCH

  • Header参数
KeyValue请求或响应
Content-typeapplication/json存在于请求和响应中,不可为空
Abis-Request-Sequence请求流水号存在于请求和响应中,请求中可以为空,如为空则由服务自动生成一个流水号
Authorization接口鉴权标识若使用ABIS云平台的接口API,则需要去 ABIS门户控制台-基本资料-鉴权密钥 中获取 立即获取
  • Body参数
Json Path类型必填含义注意事项
$.left.contentString图像1的Base64编码内容
$.left.croppingBox.xInt图像1中人脸矩形框坐标x可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.left.croppingBox.yInt图像1中人脸矩形框坐标y可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.left.croppingBox.widthInt图像1中人脸矩形框宽度可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.left.croppingBox.heightInt图像1中人脸矩形框高度可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.right.contentString图像2的Base64编码内容
$.right.croppingBox.xInt图像2中人脸矩形框坐标x可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.right.croppingBox.yInt图像2中人脸矩形框坐标y可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.right.croppingBox.widthInt图像2中人脸矩形框宽度可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸
$.right.croppingBox.heightInt图像2中人脸矩形框高度可对指定区域内的人脸进行比对,如果不指定区域,则整图检测最大且靠近中心的人脸

对应示例:
{
"left": {
"content": "SU1BR0U6IEhlbGxvIFdvcmxkCg==",
"croppingBox": {
"x": 122,
"y": 132,
"width": 433,
"height": 544
}
},
"right": {
"content": "SU1BR0U6IEhlbGxvIFdvcmxkCg==",
"croppingBox": {
"x": 122,
"y": 132,
"width": 433,
"height": 544
}
}
}

  • 返回参数
Json Path类型含义注意事项
response.statusString状态码2000:正常,非2000请查看返回message
scoredouble比对分数数值范围0-100

对应示例:
{
reply:{
score:100
}
response:{
content:"OK"
status:"2000"
}
}

错误码

错误码说明解决方案
2000成功
-2000未知的异常请查看返回的content中内容
-2020传入图片内容为空请确定是否传入了图片
-2021加载图片失败传入的不是有效图片或不支持的图片格式,支持的图片格式包括:BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
-2203提取人脸特征失败请确保图片是正面朝上的人脸图片,且人脸清晰,图片背景没有反光
-2207传入图片总量至少2个
-2208传入的第i张图片提取人脸特征失败请确保图片是正面朝上的人脸图片,且人脸清晰,图片背景没有反光
-2209提取特征失败请确保传入图片比较清晰,并且是灰度图
-2213传入的数据集合中第i是图片,但是图片内容为空请确定是否传入了图片
-2214传入的数据集合中第i是图片,但是图片加载失败传入的不是有效图片或不支持的图片格式,支持的图片格式包括:BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF

注意事项

1)支持的图片格式
BMP/JPG/TIF/PNG/WSQ/JP2/JPC/J2K/TFF
2)服务调用约束
在调用图像比对服务前,请确保客户端程序或设备与比对服务器网络连接畅通;传入图像数据要求为Base64编码;
3)若接口涉及到数据需要进行base64编码,请引用commons-codec-1.13.jar对图片进行base64编码:base64.encodeBase64String(byteData)。

示例代码(Java)

package cn.eyecool;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.imageio.ImageIO;

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 com.alibaba.fastjson.JSON;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 人脸1:1原子能力调用Demo
 * 
 * @author mawj
 * @date 2023/03/09
 */
public class MatchFaceCompareExample {

    // 连接超时时间
    private static int connTimeOut = 60 * 1000;
    // 请求原子能力的URL(实际开发调试中,可以换成自己部署的abis服务)
    private static final String url = "https://www.abis.cn/v1/comparison/image";
    // 待检测图片的本地路径
    private static String imgPath = System.getProperty("user.dir") + File.separator + "image";

    public static void main(String[] args) {
        // 读取本地图片
        File leftImageFile = new File(imgPath + File.separator + "face1.jpg");
        File rightImageFile = new File(imgPath + File.separator + "face2.jpg");
        // 组装数据结构
        MatchFaceCompareExample demo = new MatchFaceCompareExample();
        MatchParam param = demo.new MatchParam();
        param.setLeft(demo.new MatchContent(encodeImgageToBase64(leftImageFile)));
        param.setRight(demo.new MatchContent(encodeImgageToBase64(rightImageFile)));
        // 发送Http请求
        String response = doPostJson(url, JSON.toJSONString(param));
        System.out.println("响应数据:");
        System.out.println(response);
    }

    /**
     * 比对参数
     * 
     * @date 2022/05/25
     */
    @Data
    class MatchParam {

        /**
         * 图片1信息
         */
        private MatchContent left;
        /**
         * 图片2信息
         */
        private MatchContent right;
    }

    /**
     * 比对内容信息
     * 
     * @date 2022/05/25
     */
    @Data
    @AllArgsConstructor
    class MatchContent {

        /**
         * 图像Base64
         */
        private String content;
    }

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

        ByteArrayOutputStream outputStream = null;
        try {
            BufferedImage bufferedImage = ImageIO.read(imageFile);
            outputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "jpg", outputStream);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 返回Base64编码过的字节数组字符串
        return Base64.encodeBase64String(outputStream.toByteArray());
    }

    /**
     * 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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值