javaCV视频处理之提取人像视频

网友投稿 269 2022-11-12

javaCV视频处理之提取人像视频

效果图对比

左侧的为原视频,右侧为提取人像跳舞的视频。

pom文件引入依赖

com.baidu.aip

java-sdk

4.16.3

org.bytedeco

javacvfNgubjBLuE-platform

1.5.5

java核心实现代码(完整)

import com.baidu.aip.bodyanalysis.AipBodyAnalysis;

import org.bytedeco.javacv.FFmpegFrameGrabber;

import org.bytedeco.javacv.FFmpegFrameRecorder;

import org.bytedeco.javacv.Frame;

import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.*;

import java.util.HashMap;

import org.bytedeco.ffmpeg.global.avutil;

import org.bytedeco.ffmpeg.global.avcodec;

import org.json.JSONObject;

import sun.misc.BASE64Decoder;

public class VideoProcessor {

//设置APPID/AK/SK

public static final String APP_ID = "25393592";

public static final String API_KEY = "OkRDD6FQwm5hTKGSMIEL9RN4";

public static final String SECRET_KEY = "ONAxohflnqL2HwBEQB2iGUCjmO5lgywp";

final static String videoFolderPath = "C:/Users/liuya/Desktop/video/";

final static String videoName = "demo.mp4";

final static String imageFolderPath = "C:/Users/liuya/Desktop/people/";

public static void main(String[] args) throws Exception {

videoProcess(videoFolderPath + videoName);

}

//视频水印

public static void videoProcess(String filePath) {

//抓取视频图像资源

FFmpegFrameGrabber videoGrabber = new FFmpegFrameGrabber(filePath);

//抓取视频图像资源

FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(filePath);

try {

videoGrabber.start();

audioGrabber.start();

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFolderPath + "new" + videoName, videoGrabber.getImageWidth(), videoGrabber.getImageHeight(), videoGrabber.getAudioChannels());

recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);

recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);

recorder.start();

//处理图像

int videoSize = videoGrabber.getLengthInVideoFrames();

for (int i = 0; i < videoSize; i++) {

Frame videoFrame = videoGrabber.grabImage();

if (videoFrame != null && videoFrame.image != null) {

System.out.println("视频共" + videoSize + "帧,正处理第" + (i + 1) + "帧图片");

Java2DFrameConverter converter = new Java2DFrameConverter();

BufferedImage bi=converter.getBufferedImage(videoFrame);

BufferedImage bufferedImage = splitting(bi);

recorder.record(converter.convert(bufferedImage));

}

}

//处理音频

for (int i = 0; i < audioGrabber.getLengthInAudioFrames(); i++) {

Frame audioFrame = audioGrabber.grabSamples();

if (audioFrame != null && audioFrame.samples != null) {

recorder.recordSamples(audioFrame.sampleRate, audioFrame.audioChannels, audioFrame.samples);

}

}

recorder.stop();

recorder.release();

videoGrabber.stop();

audioGrabber.stop();

} catch (Exception e) {

e.prihttp://ntStackTrace();

}

}

public static BufferedImage splitting(BufferedImage image){

ByteArrayOutputStream out=new ByteArrayOutputStream();

try {

ImageIO.write(image,"png",out);

} catch (IOException e) {

e.printStackTrace();

}

return splitting(out.toByteArray());

}

public static BufferedImage splitting(byte[] image){

// 初始化一个AipBodyAnalysis

AipBodyAnalysis client = new AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY);

// 可选:设置网络连接参数

client.setConnectionTimeoutInMillis(2000);

client.setSocketTimeoutInMillis(60000);

// 传入可选参数调用接口

HashMap options = new HashMap();

options.put("type", "foreground");

// 参数为本地路径

JSONObject res = client.bodySeg(image, options);

return convert(res.get("foreground").toString());

}

public static BufferedImage convert(String labelmapBase64) {

try {

BASE64Decoder decoder = new BASE64Decoder();

byte[] bytes = decoder.decodeBuffer(labelmapBase64);

InputStream is = new ByteArrayInputStream(bytes);

BufferedImage image = ImageIO.read(is);

//失真处理

BufferedImage newBufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);

newBufferedImage.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);

ByteArrayOutputStream out=new ByteArrayOutputStream();

ImageIO.write(newBufferedImage, "png", out);

ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());

return ImageIO.read(in);

} catch (IOException e) {

e.printStackTrace();

return null;

}

}

}

控制台输出

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:K8S 1.10.1 高可用环境搭建实战
下一篇:elasticsearch 数据迁移
相关文章

 发表评论

暂时没有评论,来抢沙发吧~