利用java实现视频人像分割及视频背景替换

简介: 视频人像分割是将视频中的人体从原视频中分割出来,得到透明背景的人体视频。如何基于算法分割后的人像结果进行再加工。

视频人像分割是将视频中的人体从原视频中分割出来,得到透明背景的人体视频。如何基于算法分割后的人像结果进行再加工。
一、基于现有的视频人像分割API对视频进行解析,将视频中的人像区域mask(掩模)作为视频序列返回。返回的mask通道视频类似于这种。
视频人像分割结果.png

实现以上的效果是基于阿里云视觉智能开放平台的视频人像分割,平台提供有示例代码,
1、需要安装Alibaba Cloud SDK for Java:aliyun-java-sdk-core
该SDK包为阿里云Java核心库,无论使用哪个产品的SDK,都必须先安装该核心库。
2、推荐使用Maven管理Java项目,可以通过在pom.xml文件中添加Maven依赖安装Java SDK,依赖如下:

<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-videoseg</artifactId>
<version>${aliyun.videoseg.version}</version>

调用API接口的示例代码如下:

package com.aliyun.sample;

import com.aliyun.tea.*;
import com.aliyun.videoseg20200320.*;
import com.aliyun.videoseg20200320.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;
import com.aliyun.teautil.*;
import com.aliyun.teautil.models.*;

public class Sample {

/**
 * 使用AK&SK初始化账号Client
 * @param accessKeyId
 * @param accessKeySecret
 * @return Client
 * @throws Exception
 */
public static com.aliyun.videoseg20200320.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
    Config config = new Config()
            // 您的 AccessKey ID
            .setAccessKeyId(accessKeyId)
            // 您的 AccessKey Secret
            .setAccessKeySecret(accessKeySecret);
    // 访问的域名
    config.endpoint = "videoseg.cn-shanghai.aliyuncs.com";
    return new com.aliyun.videoseg20200320.Client(config);
}

public static void main(String[] args_) throws Exception {
    java.util.List<String> args = java.util.Arrays.asList(args_);
    com.aliyun.videoseg20200320.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
    SegmentVideoBodyRequest segmentVideoBodyRequest = new SegmentVideoBodyRequest();
    RuntimeOptions runtime = new RuntimeOptions();
    try {
        // 复制代码运行请自行打印 API 的返回值
        client.segmentVideoBodyWithOptions(segmentVideoBodyRequest, runtime);
    } catch (TeaException error) {
        // 如有需要,请打印 error
        com.aliyun.teautil.Common.assertAsString(error.message);
    } catch (Exception _error) {
        TeaException error = new TeaException(_error.getMessage(), _error);
        // 如有需要,请打印 error
        com.aliyun.teautil.Common.assertAsString(error.message);
    }        
}

}

二、对算法输出的视频Mask通道进行覆盖,先让原视频生成背景透明的视频流,采用视频中的一帧看下输出的结果如下:
invi_humansegmenter_016595069223121001355_oAMBDN.png

替换背景之后的效果如下:
Dingtalk_20220803141353.jpg

下面将使用java 的方法完成上面的效果,首先是将API输出的Mask通道视频和原视频进行叠加,生成新的背景透明视频,然后在背景透明的视频状态下,再替换视频的背景。视频是有一帧帧的图片序列组成的,所以本次的java方法也是针对图片序列进行操作。

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
public class NewImageUtils {

/**
 *
 * @Title: 构造图片
 * @Description: 生成水印并返回java.awt.image.BufferedImage
 * @param file
 *            源文件(图片)
 * @param waterFile
 *            水印文件(图片)
 * @param x
 *            距离右下角的X偏移量
 * @param y
 *            距离右下角的Y偏移量
 * @param alpha
 *            透明度, 选择值从0.0~1.0: 完全透明~完全不透明
 * @return BufferedImage
 * @throws IOException
 */
public static BufferedImage watermark(File file, File waterFile, int x, int y, float alpha) throws IOException {
    // 获取底图
    BufferedImage buffImg = ImageIO.read(file);
    // 获取层图
    BufferedImage waterImg = ImageIO.read(waterFile);
    // 创建Graphics2D对象,用在底图对象上绘图
    Graphics2D g2d = buffImg.createGraphics();
    int waterImgWidth = waterImg.getWidth();// 获取层图的宽度
    int waterImgHeight = waterImg.getHeight();// 获取层图的高度
    // 在图形和图像中实现混合和透明效果
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    // 绘制
    g2d.drawImage(waterImg, x, y, waterImgWidth, waterImgHeight, null);
    g2d.dispose();// 释放图形上下文使用的系统资源
    return buffImg;
}

/**
 * 输出水印图片
 *
 * @param buffImg
 *            图像加水印之后的BufferedImage对象
 * @param savePath
 *            图像加水印之后的保存路径
 */
private void generateWaterFile(BufferedImage buffImg, String savePath) {
    int temp = savePath.lastIndexOf(".") + 1;
    try {
        ImageIO.write(buffImg, savePath.substring(temp), new File(savePath));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

/**
 *
 * @param args
 * @throws IOException
 *             IO异常直接抛出了
 * @author bls
 */
public static void main(String[] args) throws IOException {
    String sourceFilePath = "D://img//di.png";
    String waterFilePath = "D://img//ceng.png";
    String saveFilePath = "D://img//new.png";
    NewImageUtils newImageUtils = new NewImageUtils();
    // 构建叠加层
    BufferedImage buffImg = NewImageUtils.watermark(new File(sourceFilePath), new File(waterFilePath), 0, 0, 1.0f);
    // 输出水印图片
    newImageUtils.generateWaterFile(buffImg, saveFilePath);
}

}

相关文章
|
9天前
|
Java
Java 字符串分割split空字符串丢失解决方案
Java 字符串分割split空字符串丢失解决方案
|
3月前
|
NoSQL Java 关系型数据库
基于Java swing和mysql实现的学生选课管理系统(源码+数据库+运行指导视频)
基于Java swing和mysql实现的学生选课管理系统(源码+数据库+运行指导视频)
|
3月前
|
Java 关系型数据库 MySQL
基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)
基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)
|
3月前
|
NoSQL Java 关系型数据库
基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)
基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)
|
3月前
|
NoSQL Java 关系型数据库
基于Java swing和mysql实现酒店管理系统(源码+数据库+运行指导视频+系统用户使用手册+系统PPT+数据库设计说明书+系统概要说明书+需求说明书+详细说明书)
基于Java swing和mysql实现酒店管理系统(源码+数据库+运行指导视频+系统用户使用手册+系统PPT+数据库设计说明书+系统概要说明书+需求说明书+详细说明书)
|
25天前
|
人工智能 监控 算法
java智慧城管源码 AI视频智能分析 可直接上项目
Java智慧城管源码实现AI视频智能分析,适用于直接部署项目。系统运用互联网、大数据、云计算和AI提升城市管理水平,采用“一级监督、二级指挥、四级联动”模式。功能涵盖AI智能检测(如占道广告、垃圾处理等)、执法办案、视频分析、统计分析及队伍管理等多个模块,利用深度学习优化城市管理自动化和智能化,提供决策支持。
143 4
java智慧城管源码 AI视频智能分析 可直接上项目
|
25天前
|
数据采集 JavaScript 前端开发
使用HtmlUnit库的Java下载器:下载TikTok视频
使用Java和HtmlUnit构建TikTok视频下载器,模拟浏览器行为,绕过访问限制。通过爬虫代理配置代理服务器,隐藏真实IP,多线程技术提升下载效率。示例代码展示如何设置HtmlUnit,创建代理,启用JavaScript,下载并处理视频链接。学习了页面模拟、JavaScript交互、代理使用及多线程技术,为实际爬虫项目提供参考。
使用HtmlUnit库的Java下载器:下载TikTok视频
|
2月前
|
Java
java List数组根据给定大小分割数组
在获取到很长的数组时,一次性处理数据量太大,需要分批处理,这就需要分批处理了。 1、使用List的subList,封装方法 2、google工具类型Lists的partition 经测试个人推荐使用第一种方法,效率上快了10几倍,估计是因为没有重新生成数组的原因
38 8
|
3月前
|
Python Java Go
Java每日一练(20230401) 合并K个升序链表、最长有效括号、分割回文串
Java每日一练(20230401) 合并K个升序链表、最长有效括号、分割回文串
21 0
Java每日一练(20230401) 合并K个升序链表、最长有效括号、分割回文串
|
3月前
|
JavaScript 小程序 Java
基于Java的大学生平时成绩量化管理系统设计与实现(亮点:点赞评论、上传下载视频资源、多用户论坛交流)
基于Java的大学生平时成绩量化管理系统设计与实现(亮点:点赞评论、上传下载视频资源、多用户论坛交流)
48 0