JavaCV 进行视频操作

1、JavaCV实现将视频以帧方式抽取

## JavaCV实现将视频以帧方式抽取```java
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import static org.bytedeco.javacpp.opencv_core.IplImage;
import static org.bytedeco.javacpp.opencv_core.cvReleaseImage;
import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;
import static org.bytedeco.javacpp.opencv_imgcodecs.cvSaveImage;
import static org.bytedeco.javacpp.opencv_imgproc.cvSmooth;public class JavaCV {// the image's path;final static String imagePath = "/home/lance/abc.jpg/";// the vedio's path and filename;final static String vedioPath = "/home/lance/target-a/";final static String vedioName = "origin-a.mp4";public static void main(String[] args) throws Exception {smooth(imagePath);grabberFFmpegImage(vedioPath + vedioName, vedioPath, vedioName, 30);}// the method of compress image;public static void smooth(String fileName) {IplImage iplImage = cvLoadImage(fileName);if (iplImage != null) {cvSmooth(iplImage, iplImage);cvSaveImage(fileName, iplImage);cvReleaseImage(iplImage);}}// grab ffmpegImage from vedio;public static void grabberFFmpegImage(String filePath, String fileTargetPath, String fileTargetName, int grabSize) throws Exception{FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);ff.start();for (int i = 0; i < grabSize; i++){Frame frame = ff.grabImage();doExecuteFrame(frame, filePath, fileTargetName, i);}ff.stop();}// grab frame from vedio;public static void doExecuteFrame(Frame frame, String targetFilePath, String targetFileName, int index) {if ( frame == null || frame.image == null) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();String imageMat = "jpg";String fileName = targetFilePath + File.pathSeparator + targetFileName + "_" + index + "." + imageMat;BufferedImage bi = converter.getBufferedImage(frame);File output = new File(fileName);try{ImageIO.write(bi, imageMat, output);} catch (IOException e) {e.printStackTrace();}}
}

2、javaCV视频取

GitHub路径:

https://github.com/chenhua0915/FetchVideoFrameUtil.git

pom文件中的Maven配置:

<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform  视频取帧-->
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.4.4</version>
</dependency>

实例代码:

import org.bytedeco.javacv.FFmpegFrameGrabber;
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.File;/*** Created with IDEA* 视频取帧,可设置间隔秒数或获取所有帧数** @Author Chensj* @Date 2018/4/2 14:29* @Description* @Version 1.0*/
public class FetchVideoFrameUtil {// 主函数public static void main(String[] args){try {String picPath = "D:\\demo\\pic\\";  // 提取得每帧图片存放位置String videoPath = "D:\\demo1.mp4";  // 原视频文件路径int second = 0; // 每隔多少帧取一张图,一般高清视频每秒 20-24 帧,根据情况配置,如果全部提取,则将second设为 0 即可// 开始视频取帧流程FetchVideoFrameUtil.fetchPic(new File(videoPath),picPath,second);} catch (Exception e) {e.printStackTrace();}}/*** 获取指定视频的帧并保存为图片至指定目录* @param file  源视频文件* @param picPath  截取帧的图片存放路径* @throws Exception*/public static void fetchPic(File file, String picPath,int second) throws Exception{FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file); // 获取视频文件System.out.println(FetchVideoFrameUtil.getVideoTime(file)); // 显示视频长度(秒/s)ff.start(); // 调用视频文件播放int length = ff.getLengthInAudioFrames(); //视频帧数长度System.out.println(ff.getFrameRate());int i = 0; // 图片帧数,如需跳过前几秒,则在下方过滤即可Frame frame = null;int count = 0;while (i < length) {frame = ff.grabImage(); // 获取该帧图片流System.out.print(i + ",");if(frame!=null && frame.image!=null) {System.out.println(i);writeToFile(frame, picPath, count,second); // 生成帧图片count++;}i++;}ff.stop();}/**** @param frame // 视频文件对象* @param picPath // 图片存放路径* @param count // 当前取到第几帧* @param second // 每隔多少帧取一张,一般高清视频每秒 20-24 帧,根据情况配置,如果全部提取,则将second设为 0 即可*/public static void writeToFile(Frame frame, String picPath, int count, int second){if (second == 0) {// 跳过间隔取帧判断} else if (count % second != 0){ // 提取倍数,如每秒取一张,则: second = 20return;}File targetFile = new File(picPath + count + ".jpg");System.out.println("创建了文件:" + picPath + count + ".jpg");String imgSuffix = "jpg";Java2DFrameConverter converter =new Java2DFrameConverter();BufferedImage srcBi =converter.getBufferedImage(frame);int owidth = srcBi.getWidth();int oheight = srcBi.getHeight();// 对截取的帧进行等比例缩放int width = 800;int height = (int) (((double) width / owidth) * oheight);BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);bi.getGraphics().drawImage(srcBi.getScaledInstance(width, height, Image.SCALE_SMOOTH),0, 0, null);try {ImageIO.write(bi, imgSuffix, targetFile);}catch (Exception e) {e.printStackTrace();}}/*** 获取视频时长,单位为秒* @param file* @return 时长(s)*/public static Long getVideoTime(File file){Long times = 0L;try {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);ff.start();times = ff.getLengthInTime()/(1000*1000);ff.stop();} catch (Exception e) {e.printStackTrace();}return times;}
}

3、Java从视频内截取指定时间的图

此例子可用于:视频内截取某一帧作为封面图(可指定时间)、需要视频内某张图用作表情包。。。

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;public class VideoUtil {public static void main(String[] args) {try {getImgFromVideo("D:\\ffmpeg\\ffmpeg2016\\bin\\ffmpeg.exe", "d:\\ys\\StoryBrooke.mp4", "d:\\ys\\lain.jpg", 204, 140, 0, 0, 26);} catch (Exception e) {e.printStackTrace();}}/*** 获取指定时间内的图片* @param ffmpegPath (ffmpeg路径)* @param videoPath (视频路径)* @param imgPath (图片存放路径)* @param width (图片宽度)* @param height (图片高度)* 以下为需要指定的时间* @param hour* @param min* @param sec* @return*/public static boolean getImgFromVideo(String ffmpegPath, String videoPath, String imgPath, int width,int height, int hour, int min, float sec) {try {ProcessBuilder processBuilder = new ProcessBuilder(ffmpegPath, "-y","-i", videoPath, "-vframes", "1", "-ss", hour + ":" + min+ ":" + sec, "-f", "mjpeg", "-s", width + "*" + height,"-an", imgPath);Process process = processBuilder.start();InputStream stderr = process.getErrorStream();InputStreamReader isr = new InputStreamReader(stderr);BufferedReader br = new BufferedReader(isr);while ((br.readLine()) != null);process.waitFor();if (br != null)br.close();if (isr != null)isr.close();if (stderr != null)stderr.close();} catch (Exception e) {e.printStackTrace();return false;}return true;}
}

4、Javacv截取视频图片

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import static org.bytedeco.javacpp.opencv_core.IplImage;
import static org.bytedeco.javacpp.opencv_core.cvReleaseImage;
import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;
import static org.bytedeco.javacpp.opencv_imgcodecs.cvSaveImage;
import static org.bytedeco.javacpp.opencv_imgproc.cvSmooth;public class JavaCV {// the image's path;final static String imagePath = "/home/lance/abc.jpg/";// the vedio's path and filename;final static String vedioPath = "/home/lance/target-a/";final static String vedioName = "origin-a.mp4";public static void main(String[] args) throws Exception {smooth(imagePath);grabberFFmpegImage(vedioPath + vedioName, vedioPath, vedioName, 30);}// the method of compress image;public static void smooth(String fileName) {IplImage iplImage = cvLoadImage(fileName);if (iplImage != null) {cvSmooth(iplImage, iplImage);cvSaveImage(fileName, iplImage);cvReleaseImage(iplImage);}}// grab ffmpegImage from vedio;public static void grabberFFmpegImage(String filePath, String fileTargetPath, String fileTargetName, int grabSize) throws Exception{FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);ff.start();for (int i = 0; i < grabSize; i++){Frame frame = ff.grabImage();doExecuteFrame(frame, filePath, fileTargetName, i);}ff.stop();}// grab frame from vedio;public static void doExecuteFrame(Frame frame, String targetFilePath, String targetFileName, int index) {if ( frame == null || frame.image == null) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();String imageMat = "jpg";String fileName = targetFilePath + File.pathSeparator + targetFileName + "_" + index + "." + imageMat;BufferedImage bi = converter.getBufferedImage(frame);File output = new File(fileName);try{ImageIO.write(bi, imageMat, output);} catch (IOException e) {e.printStackTrace();}}
}

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

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

相关文章

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记10 - STM32的SDIO学习2 一、问题回顾二、本次的任务三、 需要注意的问题3.1 Card Identification Mode时的时钟频率3.2 CMD0指令的疑似问题3.3 发送带参数的ACMD41时要注意时间时序和时效3.4 CPSM的指令发送问题3.5 调试过程中的SD卡的…

linuxOPS基础_linux系统注意事项

Linux严格区分大小写 Linux 和Windows不同&#xff0c;Linux严格区分大小写的&#xff0c;包括文件名和目录名、命令、命令选项、配置文件设置选项等。 例如&#xff0c;Win7 系统桌面上有文件夹叫做Test&#xff0c;当我们在桌面上再新建一个名为 test 的文件夹时&#xff0c…

R统计学2 - 数据分析入门问题21-40

往期R统计学文章&#xff1a; R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算&#xff1f; 使用函数 apply() vec 1:20 # 转换为矩阵 mat matrix (vec , ncol4) # [,1] [,2] [,3] [,4] # [1,] 1 6 11 16 # [2,] 2 7 12 17 # [3,] …

操作系统的基本概念5-系统调用

系统调用是操作系统提供给应用程序的一种接口&#xff0c;通过这个接口&#xff0c;应用程序可以请求操作系统执行特定的操作&#xff0c;例如读写文件、创建进程、网络通信等。系统调用是应用程序与操作系统之间的桥梁&#xff0c;它允许应用程序访问底层的硬件和资源。 系统…

总结工作中vue2和vue3的知识点区别

vue2和vue3的区别 前言 vue2升级vue3之后变得更快&#xff0c;更轻&#xff0c;协作更方便。无论对于我们开发者的体验或者用户使用方面都是升级优化&#xff0c;但是本质区别是什么&#xff0c;下面分为几个部分进行讲解。vue2和vue3 对比vue2vue3脚手架命令式可视化创建脚…

嵌入式Linux串口和 poll() 函数的使用

一、poll() 函数的介绍 poll() 函数用于监控多个文件描述符的变化的函数。它可以用来检查一个或多个文件描述符的状态是否改变&#xff0c;比如是否可读、可写或有错误发生。它常用于处理 I/O 多路复用&#xff0c;这在需要同时处理多个网络连接或文件操作时非常有用。 头文件…

CentOS 7.6安装部署Seafile服务器

今天飞飞和你们分享CentOS 7.6上安装基于MySQL/MariaDB的Seafile服务器的方法&#xff0c;包括下载和安装7.0.5版本、配置数据库、启动服务器等步骤。安装成功后&#xff0c;需要通过nginx反向代理才能访问seafile服务。 通过预编译好的安装包来安装并运行基于 MySQL/MariaDB …

爬虫之矛---JavaScript基石篇1<window对象、Node.js和prototype/constructor的解析(1)>

前言: JavaScript是一种广泛应用的编程语言&#xff0c;几乎在所有现代浏览器中都能运行。它已成为Web开发的基石&#xff0c;使我们能够为用户提供交互性和动态性。在JavaScript中&#xff0c;有几个重要的概念和对象&#xff0c;其中包括window对象、Node.js以及prototype/c…

蓝桥杯大赛软件python赛道真题:跑步锻炼

真题链接&#xff1a;https://www.lanqiao.cn/problems/597/learning/ 题目描述&#xff1a; 小蓝每天都锻炼身体。 正常情况下&#xff0c;小蓝每天跑1干米。如果某天是周一或者月初(1 日)&#xff0c;为了激励自己&#xff0c;小蓝要跑2干米。如果同时是周一或月 初&#xff…

高吞吐SFTP连接池设计方案

背景 在现代的数据驱动环境中&#xff0c;安全文件传输协议&#xff08;SFTP&#xff09;扮演着至关重要的角色&#xff0c;它提供了一种安全、可靠的文件传输方式。我们目前项目是一个大型数据集成平台&#xff0c;跟上下游有很多文件对接是通过SFTP协议&#xff0c;当需要处…

果蔬作物疾病防治系统|基于Springboot的果蔬作物疾病防治系统设计与实现(源码+数据库+文档)

果蔬作物疾病防治系统目录 目录 基于Springboot的果蔬作物疾病防治系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、果蔬百科列表 2、公告信息管理 3、公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

【蓝桥·算法双周赛】第七场分级赛——小白入门赛

2.霓虹【算法赛】 - 蓝桥云课 (lanqiao.cn) st数组用来存第i个位置&#xff0c;这个字母有没有编号j #include<bits/stdc.h> const int N1e610; using lllong long; std::map<std::string,std::string> mp;std::string a,aa; int st[N][10];// int stt[N][10];//对…

Qt 拖动事件

文章目录 1 自定义控件 TextEdit2 实现打开文件功能3 实现鼠标滚轮放大字体 QEvent::DragEnter 当拖动文件进入到窗口/控件中时&#xff0c;触发该事件&#xff0c;它对应的子类是QDragEnterEvent QEvent::DragLeave 当拖动文件离开窗口/控件时&#xff0c;触发该事件&#xff…

【C/C++ 学习笔记】流程结构

【C/C 学习笔记】流程结构 视频地址: Bilibili 顺序结构 程序按顺序执行&#xff0c;不发生跳转 选择结构 依据条件是否满足&#xff0c;有选择的执行相应功能 v-if 结构 if (age < 18) {cout << "You are a child." << endl; } else if (age …

WordPress高端后台美化WP Adminify Pro优化版

后台UI美化WP Adminify Pro修改自定义插件&#xff0c;适合建站公司和个人使用&#xff0c;非常高大上&#xff0c;下载地址&#xff1a;WP Adminify Pro优化版 修复记录&#xff1a; 1、修复已知BUG 2、修复手机版兼容问题 3、修复打开速度&#xff0c;原版打开速度太慢 4…

自动裁剪人脸:简化你的数字人素材准备

在做数字人时,需要对采集的数据进行预处理,然后才能进行模型训练, 预处理常用的操作有:去背景 音频重采样 视频裁剪 音频特征提取等等,今天我们来分享一个自动化脚本: 对原图/视频进行人脸检测并根据目标尺寸以人脸为中心进行裁剪. 目录 1. 效果 2. 对图片进行裁剪 3.对视频…

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接&#xff1a;DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…

华为OD面试分享11(2024年)

背景: 21届非科班211目标院校,无经验转行有编程基础,gap1年多一点1.19 机考 250(准备一周左右技术面试,才开始投递部门的)第一题 平衡字符串 第二题 剩余银饰重量 第三题不太记得,只过了一点用例 机试前两题是原题,有在栗栗姐给的题库刷到过 1.26 原先投递部门因为…

CCCoreLib 点云间近似距离计算(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 CloudCompare设计之初就是为了比较两个点云之间的差别,这里的点云间近似距离计算就是一种比较两个点云的方法。CloudCompare特有的八叉树结构,可以使它通过计算体素(Voxel)与体素之间的距离快速评估点云之间的近…

umi4 项目使用 keepalive 缓存页面(umi-plugin-keep-alive、react-activation)

umi4使用keepalive 配置文件config\config.ts export default defineConfig({plugins: [umi-plugin-keep-alive], });安装add umi-plugin-keep-alive yarn add umi-plugin-keep-alive页面 A import { KeepAlive, history, useAliveController } from umijs/max; const Page…