接口能力:java
对于输入的一张图片(可正常解码,且长宽比适宜),识别人体的轮廓范围,与背景进行分离,适用于拍照背景替换、照片合成、身体特效等场景。输入正常人像图片,返回分割后的二值结果图和分割类型(目前仅支持person)。算法
算法用于将图片中的人像和背景进行分离,能够应用于APP背景替换,背景虚化等场景。json
1.1 背景替换
利用分割结果进行背景的替换。好比图片中的人像的背后背景能够更换背景色,例如蓝底红底证件照。缓存
1.2 背景虚化
利用分割的结果将背景进行虚化获得更美的更有艺术效果的照片,例如滤镜。bash
此接口返回的数据须要额外的处理。post
须要对Java的BufferedImage、ImageIO、Graphics2D有必定的了解。对图像处理灰度 二值化有了解。测试
示例代码中使用到了第三方的json处理包fastjson编码
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency>
感谢百度相关RD提供的Java处理代码哦.net
import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import javax.imageio.ImageIO; import sun.misc.BASE64Decoder; import com.alibaba.fastjson.JSONObject; //Base64Util FileUtil HttpUtil百度提供 自行下载便可 小帅整理的下载地址 //http://aixiaoshuai.mydoc.io/?t=234826 import com.xs.util.baidu.Base64Util; import com.xs.util.baidu.FileUtil; import com.xs.util.baidu.HttpUtil; /** * 人像分割Java-API示例代码 * @author 小帅丶 * */ public class BodySegSample { //人像分割接口地址 public static String BODYSEG_URL = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg"; public static void main(String[] args) throws Exception { String accessToken = "本身应用获取的AccessToken"; //返回字符串 String filePath = "G:/bodyseg.jpg"; String result = getBodySegResult(filePath, accessToken); JSONObject jsonObject = JSONObject.parseObject(result); //图片转BufferedImage对象 BufferedImage image = ImageIO.read(new File(filePath)); //对接口返回的labelmapbase64进行处理 并拿图片的原始宽高 convert(jsonObject.getString("labelmap"),image.getWidth(),image.getHeight()); } /** * @param imagePath 图片本地路径 * @param accessToken 应用AccessToken * @return String * @throws Exception */ private static String getBodySegResult(String imagePath, String accessToken) throws Exception { byte[] imgData = FileUtil.readFileByBytes(imagePath); String imgStr = Base64Util.encode(imgData); String param = "image=" + URLEncoder.encode(imgStr, "UTF-8"); // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过时时间, // 客户端可自行缓存,过时后从新获取。 String result = HttpUtil.post(BODYSEG_URL, accessToken, param); return result; } /** * 图像转换 * @param labelmapBase64 分割结果图片,检测出的二值图像,base64编码以后 * @param realWidth 图片原始高度px * @param realHeight 图片原始宽度px */ public static void convert(String labelmapBase64, int realWidth, int realHeight) { try { BASE64Decoder base64Decoder = new BASE64Decoder(); byte[] bytes = base64Decoder.decodeBuffer(labelmapBase64); InputStream is = new ByteArrayInputStream(bytes); BufferedImage image = ImageIO.read(is); BufferedImage newImage = resize(image, realWidth, realHeight); BufferedImage grayImage = new BufferedImage(realWidth, realHeight, BufferedImage.TYPE_BYTE_GRAY);//灰度图 for(int i= 0 ; i < realWidth ; i++){ for(int j = 0 ; j < realHeight; j++){ int rgb = newImage.getRGB(i, j); grayImage.setRGB(i, j, rgb * 255); //将像素存入缓冲区 这一步很重要哦 } } File newFile = new File("G:/gray001.jpg"); ImageIO.write(grayImage, "jpg", newFile); } catch (IOException e) { e.printStackTrace(); } } /** * 重置图片大小 * @param img 图片数据 * @param newW 图片宽度 * @param newH 图片高度 * @return */ public static BufferedImage resize(BufferedImage img, int newW, int newH) { Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH); BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = dimg.createGraphics(); g2d.drawImage(tmp, 0, 0, null); g2d.dispose(); return dimg; } }