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

这篇具有很好参考价值的文章主要介绍了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>

需要要到的图片如下:
javacv 图片生成视频,粉丝专栏,java,音视频,开发语言

完整代码如下:


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张,添加到视频录制器内,最终生成视频。

控制台运行输出日志
javacv 图片生成视频,粉丝专栏,java,音视频,开发语言文章来源地址https://www.toymoban.com/news/detail-799258.html

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

到了这里,关于Java原来可以这么玩!CV实现多张图片生成视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原来可以这么玩?Jmeter接口性能测试工具玩转测试Redis数据库(超详细)

    Jmeter作为当前非常受欢迎的接口测试和性能测试的工具,在企业中得到非常广泛的使用,而redis作为缓存数据库,也在企业中得到普遍使用,那如何使用jmeter来测试redis数据库呢? 今天我们就来讲一讲怎么使用jmeter来调用redis。 Jmeter准备 由于jmeter本身并没有带有redis的测试入

    2024年02月13日
    浏览(43)
  • 4 OpenCV实现多目三维重建(多张图片增量式生成稀疏点云)【附源码】

    本文是基于 OpenCV4.80 进行的,关于环境的配置可能之后会单独说,先提一嘴 vcpkg 真好用 从多张图片逐步生成稀疏点云,这个过程通常包括以下步骤: 初始重建: 初始两张图片的选择 十分重要 ,这是整个流程的基础,后续的增图都是在这两张图片的基础上进行的 对于输入图

    2024年02月06日
    浏览(31)
  • Python实现京东茅台抢购脚本, 原来这么简单

    前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 京东茅台抢购脚本可以分为以下几部分,具体实现步骤如下: 1. 登录京东账号 首先需要登录京东账号。 一个简单的方式是使用Python的 selenium 库。 在使用 seleniu

    2024年02月13日
    浏览(46)
  • 【SpringBoot】集成SpringSecurity+JWT实现多服务单点登录,原来这么easy

    Spring Boot+Spring Security+JWT实现单点登录 介绍: 单点登录(SingleSignOn,SSO) ,当用户在身份 认证服务器 上登录一次以后,即可 获得访问单点登录系统中其他关联系统和应用软件的权限 ,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用

    2024年02月02日
    浏览(31)
  • uniapp 小程序 多张图片生成海报以及下载海报

    上代码 下载海报 我的上一篇博客有后半部分图片保存代码! 搞定! 日常开发代码记录。

    2024年04月25日
    浏览(33)
  • vue项目将多张图片生成一个gif动图

    当前做项目有一个需求是将多张图片生成一个gif动图的形式 类似下面图片几张图片叠加生成一个gif动图 图片涉及工作隐私,就不公开啦  我们要引入一个gif.js的引入包,但是他没有直接引入的方式,只能从官方下载文件包,下载地址:git地址 下载好的包找到下面这个两个文

    2024年02月03日
    浏览(26)
  • 【Java】如何通过一次请求获取多张图片

    背景:一次请求响应一张图片 这是我们熟练的业务,就是用户访问我们编写的接口,后端服务就响应一张图片给网页,也就是一个url对应的就是一个图片资源 下面是具体的业务代码和注释 编写完这些代码后运行后端服务,然后我们在网页上访问这个接口  图片成功的在网页

    2024年02月07日
    浏览(33)
  • JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片

    ---------------------------------------------效果---------------------------------------------------------- 1.单张图片 2.多张图片

    2024年02月11日
    浏览(35)
  • opencv多张图片实现全景拼接

       最近camera项目需要用到全景拼接,故此查阅大量资料,终于将此功能应用在实际项目上,下面总结一下此过程中遇到的一些问题及解决方式,同时也会将源码附在结尾处,供大家参考,本文采用的opencv版本为3.4.12。   首先说一下此源码的大概执行流程,此项目进行全

    2024年01月17日
    浏览(31)
  • 记录--原来前端部署这么简单

    有个朋友说前端技能大家大部分都会,就是部署项目这一块经验都比较稀缺,一直很想学一下。所以在这里写一篇简单的从零开始部署前端项目的全过程,感兴趣的掘友们或者想自己搭建项目部署的可以看一下这篇。 首先我们需要进行环境搭建主要就是 服务器 和 nginx配置

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包