Java原来可以这么玩!CV实现多张图片生成视频

前言

比如我像将几张图片变成一个视频的形式发不到短视频平台,虽然短视频平台也有上传图片变成视频的功能,但是我想要具体控制每张图片显示多久后切换到下一个图片,短视频平台目前无法实现,于是乎,我用java代码实现了这个功能。

生成视频展示

多张图片生成视频

javaCV 简介

JavaCV 是一个开源的计算机视觉库,专门为 Java 平台设计。它是一个封装库,通过提供一个统一且易于使用的 API,使得开发者能够访问和利用多种流行的计算机视觉和多媒体处理库。

以下是一些 JavaCV 的主要特性和方面:

  1. 集成多种库:JavaCV 集成了多个开源的计算机视觉和多媒体处理库,包括:

    • OpenCV:一个强大的实时计算机视觉库。
    • FFmpeg:一个广泛用于音频和视频处理的多媒体框架。
  2. 跨平台支持:JavaCV 支持多种操作系统,包括 Windows、Linux、MacOS,以及移动平台 Android 和 iOS。

  3. JNI 调用:JavaCV 基于 JavaCPP 调用方式(JNI 的一层封装),使得 Java 程序能够直接调用 C/C++ 的原生库,从而实现高性能的计算机视觉处理。

  4. 硬件加速:JavaCV 提供了硬件加速的全屏幕图像显示(CanvasFrame),可以提高图像处理和显示的效率。

  5. 并行处理:JavaCV 易于在多个内核中执行并行代码,有助于提升计算密集型任务的性能。

  6. 实用工具类:JavaCV 提供了一系列辅助类和方法,帮助开发者更容易地将 OpenCV、FFmpeg 等库的功能融入到 Java 应用程序中。

  7. 文档与资源:JavaCV 提供了中文文档和中英对照文档下载,包括 API 文档、源代码、Maven 依赖信息文件等,方便开发者参考和学习。

通过使用 JavaCV,开发者可以在 Java 平台上轻松地进行图像处理、视频分析、机器学习等计算机视觉相关的开发工作。

教程

添加jar依赖

   <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>

需要要到的图片如下:
在这里插入图片描述

完整代码如下:


import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.*;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** @author tarzan*/
public class ImageToVideo {final static String imagePath = "E:/images";final static String videoPath = "E:/video/imageVideo3.mp4";final static int interval = 3;//视频每秒帧率final static int frameRate = 10;public static void main(String[] args) throws Exception {long start = System.currentTimeMillis();//图片合成视频imagesToVideo(videoPath, imagePath,interval);System.out.println("耗时 " + (System.currentTimeMillis() - start) + " ms");}public static void imagesToVideo(String saveMp4name, String imagesPath,int interval) throws IOException {// 列出目录中所有的图片File fileDir = new File(imagesPath);File[] listFiles = fileDir.listFiles();List<BufferedImage> images = new ArrayList<>(listFiles.length);for (File file : listFiles) {BufferedImage  image= null;try {//读取原图BufferedImage originalImage = ImageIO.read(file);if(BufferedImage.TYPE_4BYTE_ABGR==originalImage.getType()){//转换图片类型image = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR);image.createGraphics().drawImage(originalImage,0,0,null);}else {image=originalImage;}} catch (IOException e) {System.out.println(e.getMessage());}if (image != null) {images.add(image);}}int maxWidth=Integer.MIN_VALUE;int maxHeight=Integer.MIN_VALUE;for (BufferedImage image : images) {if(image.getWidth()>maxWidth){maxWidth=image.getWidth();}if(image.getHeight()>maxHeight){maxHeight=image.getHeight();}}FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(saveMp4name,1920, 1080, 2);// recorder.setVideoBitrate(2000000);recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("mp4");recorder.setFrameRate(frameRate);recorder.start();for (BufferedImage image : images) {int i=images.indexOf(image);System.out.println("处理进度条: " + (i+1) + "/" + images.size());Frame frame = Java2DFrameUtils.toFrame(image);for (int j = 0; j < frameRate*interval; j++) {recorder.record(frame);}i++;}recorder.stop();recorder.release();}}
  • 根据自己的情况修改代码中的图片目录和生成视频的路径,以及每张图片显示的时长。

原理

通过遍历指定文件夹下的所有图片,求出最大的宽度和高度,设置为视频的宽高。以每秒30帧为单位,复制每张图片为30张或者30*n张,添加到视频录制器内,最终生成视频。

控制台运行输出日志
在这里插入图片描述

  • 6张图片生成每秒30帧的视频,需要8.5s。
  • 6张图片生成每秒10帧的视频,需要4.6s。
  • 帧率设置为10以下时候,首次打开视频的开头会出现延时黑屏的现象,所以建议帧率为10以上。
    在这里插入图片描述
    -后续还可以用视频工具(比如剪映等)整合背景音乐视频。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/299836.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023版本QT学习记录 -6- UDP通信之UDP接收端

———————UDP接收端——————— &#x1f384;动图演示 &#x1f384;发送端通信步骤思维导图 &#x1f384;添加组件 QT core gui network&#x1f384;添加头文件 #include "qudpsocket.h"&#x1f384;创建接收对象 QUdpSocket *recvsocket;&…

JAVA JDK8时间类之Period、Duration、ChronoUnit的使用【详解】

JAVA JDK8时间类之Period、Duration、ChronoUnit的使用 1. Duration1.1 简介&#xff1a;用于时间间隔(秒、毫秒、纳秒等)1.2 案例 2. Period时间间隔(年、月、日)2.1 简介2.2 案例 3. ChronoUnit3.1 简介案例 4. 案例所有代码&#xff1a; 1. Duration 1.1 简介&#xff1a;用…

基于AT89C51单片机的8位密码锁仿真与实物制作

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88657969?spm1001.2014.3001.5503 源码获取 C 源码仿真图毕业设计实物制作步骤01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表…

Python如何使用数据库的连接池

Python 数据库连接池 python编程中可以使用pymysql进行数据库连接及增删改查操作&#xff0c;但每次连接mysql请求时&#xff0c;都是独立的去请求访问&#xff0c;比较浪费资源&#xff0c;而且访问数量达到一定数量时&#xff0c;对mysql的性能会产生较大的影响。因此实际使…

QT trimmed和simplified

trimmed&#xff1a;去除了字符串开头前和结尾后的空白&#xff1b; simplified&#xff1a;去除了字符串开头前和结尾后的空白&#xff0c;以及中间内部的空白字符也去掉&#xff08;\t,\n,\v,\f,\r和 &#xff09; 代码&#xff1a; QString str " 1 2 3 4 5 …

主机安全技术措施

目录 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 ​编辑 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 ~over~

PaddleOCR 的使用,极简介绍

安装 参考github的官网就可以&#xff1a; github链接 简单的说&#xff0c;就是两句话&#xff1a; python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple pip install "paddleocr>2.0.1" # 推荐使用2.0.1版本 Python下的使用…

(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散

Shifted Diffusion for Text-to-image Generation 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1 偏移扩散 3. 实验 3.1 无监督文本到图像生成 3.2 无…

交友系统设计:哪种地理空间邻近算法更快?

小熊学Java&#xff1a;https://javaxiaobear.cn 交友与婚恋是人们最基本的需求之一。随着互联网时代的不断发展&#xff0c;移动社交软件已经成为了人们生活中必不可少的一部分。然而&#xff0c;熟人社交并不能完全满足年轻人的社交与情感需求&#xff0c;于是陌生人交友平台…

嵌入式面试准备

题目都摘于网上 嵌入式系统中经常要用到无限循环&#xff0c;如何用C编写死循环 while(1){}或者for(;&#x1f609; 内存分区 代码区&#xff0c;全局区&#xff08;全局变量&#xff0c;静态变量&#xff0c;以及常量&#xff09;&#xff0c;栈区&#xff0c;堆区 const关键…

智能优化算法应用:基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.沙猫群算法4.实验参数设定5.算法结果6.参考文…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为IC或TWI&#xff08;Two-Wire Interface&#xff09;&#xff0c;是一种广泛使用的串行…