0
点赞
收藏
分享

微信扫一扫

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

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

一、基于现有的视频人像分割API对视频进行解析,将视频中的人像区域mask(掩模)作为视频序列返回。返回的mask通道视频类似于这种。

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

实现以上的效果是基于阿里云视觉智能开放平台的视频人像分割,平台提供有示例代码,

1、需要安装Alibaba Cloud SDK for Java:aliyun-java-sdk-core

该SDK包为阿里云Java核心库,无论使用哪个产品的SDK,都必须先安装该核心库。

2、推荐使用Maven管理Java项目,可以通过在pom.xml文件中添加Maven依赖安装Java SDK,依赖如下:


<dependency>

    <groupId>com.aliyun</groupId>

    <artifactId>aliyun-java-sdk-videoseg</artifactId>

    <version>${aliyun.videoseg.version}</version>

</dependency>


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


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

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

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

下面将使用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;

    }

 

 

举报

相关推荐

0 条评论