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

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 视频人像分割是将视频中的人体从原视频中分割出来,得到透明背景的人体视频。如何基于算法分割后的人像结果进行再加工。

视频人像分割是将视频中的人体从原视频中分割出来,得到透明背景的人体视频。如何基于算法分割后的人像结果进行再加工。
一、基于现有的视频人像分割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);
}

}

相关文章
|
8月前
|
存储 安全 Java
基于Java爬取微博数据(四) 获取 图片 or 视频
【5月更文挑战第14天】基于Java爬取微博数据(四) 图片 or 视频 下载
|
8月前
|
Java
Java 字符串分割split空字符串丢失解决方案
Java 字符串分割split空字符串丢失解决方案
|
7月前
|
IDE Java 编译器
使用Java分割PDF文件
使用Java分割PDF文件
139 1
|
3月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
216 1
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的反诈视频宣传系统
基于Java+Springboot+Vue开发的反诈视频宣传系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的反诈视频宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
87 4
基于Java+Springboot+Vue开发的反诈视频宣传系统
|
8月前
|
人工智能 监控 算法
java智慧城管源码 AI视频智能分析 可直接上项目
Java智慧城管源码实现AI视频智能分析,适用于直接部署项目。系统运用互联网、大数据、云计算和AI提升城市管理水平,采用“一级监督、二级指挥、四级联动”模式。功能涵盖AI智能检测(如占道广告、垃圾处理等)、执法办案、视频分析、统计分析及队伍管理等多个模块,利用深度学习优化城市管理自动化和智能化,提供决策支持。
433 4
java智慧城管源码 AI视频智能分析 可直接上项目
|
5月前
|
Java
Java系列之:字符串的截取及分割 split() 和 substring()
这篇文章通过示例代码讲解了Java中字符串的截取和分割操作,包括使用`split()`方法根据正则表达式进行字符串分割以及使用`substring()`方法进行字符串截取的不同使用方式及其输出结果。
Java系列之:字符串的截取及分割 split() 和 substring()
|
7月前
|
Java
java字符串分割split你用对了吗
java字符串分割split你用对了吗
|
7月前
|
Java
java将字符串按照指定长度分割成字符串数组
java将字符串按照指定长度分割成字符串数组
178 0
|
7月前
|
Java
java实现视频和配音音频的合成
java实现视频和配音音频的合成
138 0

热门文章

最新文章