OpenCV-Java版学习(3.对视频的基本操作)
前言
上一节我们学习了使用OpenCV对图像进行一些基础操作,现在我们学习对视频进行一些基础的操作。
对视频的基本操作
从相机中读取视频
我们从电脑自带的摄像头捕捉一段视频并在屏幕上显示出来,代码如下:
import org.junit.jupiter.api.Test;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import org.springframework.boot.test.context.SpringBootTest;import java.net.URL;import static org.opencv.highgui.HighGui.*;
import static org.opencv.highgui.HighGui.destroyAllWindows;
import static org.opencv.imgproc.Imgproc.cvtColor;@SpringBootTest
class Demo2ApplicationTests {@Testpublic void testCamera() throws Exception{System.setProperty("java.awt.headless","false");URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");System.load(url.getPath());//创建一个 VideoCapture 对象VideoCapture videoCapture = new VideoCapture(0);//判断是否成功打开摄像机if (!videoCapture.isOpened()){throw new Exception("video open fail");}Mat image = new Mat();int stopFlag;//循环展示捕捉到的视频帧while(true){//捕捉、解码并返回下一个视频帧videoCapture.read(image);//将捕捉到的视频帧在屏幕上展现出来imshow("frame",image);//在10毫秒内等待用户事件stopFlag = waitKey(10);System.out.println(stopFlag);if (stopFlag==27){break;}}//完成所有操作后,释放捕获器videoCapture.release();destroyAllWindows();}
}
上面用到的一些新的方法我们来讲解一下他们的使用,如下:
- VideoCapture构造方法
这里我们是从摄像机捕捉视频的,所以这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可,如:1表示第二台摄像机,2表示第三台摄像机…以此类推。
定义如下:
//index为摄像机的标志符
public VideoCapture(int index);
- videoCapture.isOpened()方法
我们一般使用该方法来判断摄像机是否初始化,如果未初始化即返回false。 - videoCapture.read()方法
我们使用它来捕捉、解码并返回下一个视频帧,捕捉成功返回true,失败返回false。
该方法定义如下:
public boolean read(Mat image);
image即为返回的视频帧。
- videoCapture.release()方法
release()方法一般用来关闭视频文件或者摄像头。
该方法的定义如下:
public void release();
小插曲:
一开始我在waitKey()方法这里我跟着教程设置的是1毫秒内捕捉用户事件的,即:stopFlag = waitKey(1);,但是后面我一直在按Esc退出它都毫无反应,当时我的心情…
后面按了好多次才退出程序,想了想才发现原来这波是智商掉线,在1毫秒内触发事件,我得恰好在那1毫秒内按到Esc键,怪不得按了那么久才触发,后来改成10毫秒好了。
从文件播放视频
它与从相机捕获相同,只是用视频文件名更改摄像机索引,代码如下:
import org.junit.jupiter.api.Test;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import org.springframework.boot.test.context.SpringBootTest;import java.net.URL;import static org.opencv.highgui.HighGui.*;
import static org.opencv.highgui.HighGui.destroyAllWindows;@SpringBootTest
class Demo2ApplicationTests {/*** 读取本地文件的视频* @throws Exception*/@Testpublic void testCamera2() throws Exception{System.setProperty("java.awt.headless","false");URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");URL videoUrl = ClassLoader.getSystemResource("video/test2.mp4");System.load(url.getPath());VideoCapture videoCapture = new VideoCapture(videoUrl.getPath());if (!videoCapture.isOpened()){throw new Exception("video open fail");}Mat image = new Mat();while(videoCapture.isOpened()){videoCapture.read(image);if (image.empty()){break;}imshow("frame",image);waitKey(25);}videoCapture.release();destroyAllWindows();}
}
我们可以看到在读取本机的视频文件的时候,我们只要往VideoCapture的构造方法里面传视频文件的地址或者文件名就可以了。
注意:
在播放视频的时候waitKey()里面的值一般在25~30,此时是相当于正常倍速的播放,而值增大就相当于降低播放倍率,值减小就相当于增大播放倍率,我们可以灵活地运用它来调整视频的播放倍率。
保存视频
当我们使用摄像机捕捉了一个视频后我们想要将它保存下来怎么办,下面我们就来说说捕捉到视频后怎么将捕捉到的视频保存到计算机中。
import org.junit.jupiter.api.Test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.springframework.boot.test.context.SpringBootTest;import java.net.URL;import static org.opencv.highgui.HighGui.*;
import static org.opencv.highgui.HighGui.destroyAllWindows;@SpringBootTest
class Demo2ApplicationTests {/*** 将捕捉到的视频保存到本机* @throws Exception*/@Testpublic void testCamera3() throws Exception{System.setProperty("java.awt.headless","false");URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");System.load(url.getPath());VideoCapture videoCapture = new VideoCapture(0);if (!videoCapture.isOpened()){throw new Exception("video open fail");}int code = VideoWriter.fourcc('M','J','P','G');Size size = new Size(640,480);VideoWriter videoWriter = new VideoWriter("output.avi",code,20.0,size);Mat image = new Mat();int flag = -1;while(flag!=27){videoCapture.read(image);Core.flip(image,image,0);videoWriter.write(image);imshow("frame",image);flag = waitKey(50);}videoCapture.release();videoWriter.release();destroyAllWindows();}
}
上面使用到的一些方法的使用:
- VideoWriter构造方法
上面的代码中我使用了VideoWriter的一个构造方法来进行VideoWriter对象的初始化,其定义如下:
public VideoWriter(String filename, int fourcc, double fps, Size frameSize);
其中filename是要输出文件的名字;
fourcc是编码的形式;
fps是输出视频的帧数;
frameSize是视频帧的长宽大小。
- VideoWriter.fourcc()方法
该方法的作用是连接4个字符生成一个fourcc编码,进而对输出的视频进行编码。
定义:
public static int fourcc(char c1, char c2, char c3, char c4);
具体不同编码对应的视频格式可以上网去查询。
- Size的构造方法
用来设置视频帧的长宽。
其定义如下:
public Size(double width, double height);
- Core.flip()方法
该方法的作用是对图像进行翻转,在上面的代码中它将视频帧进行了翻转,使得最终输出的视频是倒立的。
其定义如下:
public static void flip(Mat src, Mat dst, int flipCode);
src是输入的图像;
dst是输出的图像;
filipCode是指定如何翻转图像的标志,0图像向下翻转,正值(例如:1)图像向右翻转,负值(例如:-1)表示图像同时向下向右翻转。
- videoWriter.write()方法
该方法的作用是写入下一个视频帧,将显示图像保存成视频。
其定义如下:
public void write(Mat image);
image为待写入的视频帧。
- videoWriter.release()方法
关闭视频写入。
其定义如下:
public void release();
OpenCV-Java版学习(3.对视频的基本操作)相关推荐
- 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结
[第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...
- 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录
基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...
- Java从小白到大牛第4篇项目实战视频课程2——Java版QQ-关东升-专题视频课程
Java从小白到大牛第4篇项目实战视频课程2--Java版QQ-1778人已学习 课程介绍 本项目是Java SE技术实现的QQ2006聊天工具,所涉及到的知识点:Java面向对象.L ...
- 微信公众号开发-Java版学习笔记
微信公众号开发整体不难,主要是熟悉微信公众号常用的一些接口文档,然后会一门后端语言(比如java)即可. 罗召勇老师教程:微信公众号开发-Java版(蓝桥罗召勇) 微信公众号文档:微信公众号官方文档 ...
- 超硬核全套Java视频教程(学习路线+免费视频+配套资料)
文内福利,扫码免费领取 Hello,各位锋迷们,我是小千.很多学习Java的小伙伴都在找的全套免费java视频教程,这里全都有,资料齐全,拿来吧你! 零基础学Java的学习路线图是怎样的?! 曾经写过 ...
- WorldWind Java 版学习:1、启动过程
一.JOGL使用介绍 使用 JOGL,需要构造GLCapabilities.GLCanvas 和 GLEventListener 的对象,其中 GLCapabilities 对象用于构造 GLCanv ...
- world wind java_WorldWind Java 版学习:1、启动过程
一.JOGL使用介绍 使用 JOGL,需要构造GLCapabilities.GLCanvas 和 GLEventListener 的对象,其中 GLCapabilities 对象用于构造 GLCanv ...
- 微信小程序java在线学习系统平台 视频课程学习
运行环境 jdk版本:1.8 及以上 ide工具:IDEA ,微信小程序开发工具 数据库: mysql 编程语言: Java tomcat: 8.0 及以上 java框架:SSM maven: 3.6 ...
- java 递归_采用递归算法求解迷宫问题(Java版) | 附代码+视频
递归算法能够解决很多计算机科学问题,迷宫问题就是其中一个典型案例.本篇教程我们将采用递归算法求解迷宫问题,输出从入口到出口的所有迷宫路径. 01 用递归算法解决迷宫问题 迷宫问题在<数据结构教程 ...
- Opencv Python版学习笔记01.计算机眼中的图像
在计算机眼里,图像是通过数字矩阵的形式存储的.如上图所示,这张图片被分为了若干个小方格,但是每个方格仍然不够小,随意取出一个方格放大观察,这个方格是由许多小格组成的,其中每个小格叫做一个像素点,像素点 ...
最新文章
- txt 导入 mysql python_Python导入txt数据到mysql的方法
- JSON 基础解释.
- EK算法应用,构图(POJ1149)
- 如何在 Eclipse 中使用命令行
- linux登录界面主题,Ubuntu 18.10(Cosmic Cuttlefish) 新登录界面亮相,主题为Yaru
- php自带解压缩,PHP自带ZIP压缩、解压缩类ZipArchiv使用指南_PHP教程
- 面试之手撕BP反向传播
- 并发编程之美(1)并发编程基础
- ApacheHttpServer出现启动报错:the requested operation has failed解决办法
- android多音字排序,再谈Contacts中姓氏多音字排序错误问题
- APM中SBUS信号解析
- Unity5.0 Shader 极简入门(一)
- 前端彷英雄联盟官网/个人心得
- C++之责任链(Chain of Responsibility)模式
- pyinstaller编译报错 IsADirectoryError: [Errno 21] Is a directory
- 连接服务器框架协议通信,通信服务协议范本3篇.doc
- java 不生成文件下载_java – 浏览器不生成文件下载对话框
- C#使用表达式树不能包含动态操作,使用反射的方式来实现T类型
- kafka命令行操作,topic相关命令
- 发自内心的恐惧一个人,怎么做才能坦然面对他?