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();
相关文章:

win7如何设置某个软件不弹出用户账户控制
手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面新建值,值的名字是程序的全路径,值数据是“RunAsInvoker”。 该程序在没有修改系统文件或设置的情况下不会弹出用户帐户控…

IDEA热部署基于maven的web项目
第一步:首先先创建web项目 按照向导一步一步完成项目创建,我创建的示例项目为hotdeploddemo 第二步:设置项目的web资源 下图中的路径要修改正确,指向src/main/webapp/WEB-INF下面的web.xml,然后点击右下角的fix创建artifacts 第三…

2021全国高校计算机能力挑战赛(初赛)C语言试题一
输入两个整数x,y,输出x,y中各位数重新组合的可能形成最小的数。 #include <stdio.h>int main() {int n1, n2, tmp;int s[10000];int i 0;scanf("%d %d", &n1, &n2);while (n1 ! 0) {s[i] n1 % 10;i;n1 n1 / 10;}while (n2 ! 0) {s[i] n…

Unity创建游戏VFX视觉特效-初级到中级
MP4 |视频:h264,1280720 |音频:AAC,44100 Hz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.36 GB |时长:4h 17m 本课程是关于用Unity视觉效果图为游戏创建VFX。 你将从零开始学习VFX图形࿰…

关于object references an unsaved transient instance - save the transient instance before flushing的解决方法
关于object references an unsaved transient instance - save the transient instance before flushing的解决方法 异常信息 object references an unsaved transient instance - save the transient instance before flushing : com.gcl.demo.entity.Borrow.member -> c…

Java——Math类
Java中的Math类包含了基本的数学运算方法。下面将从以下几部分进行讲解。debug后发现,常量E和常量PI均为double类型。

SpringMVC工作环境搭建 配置文件
web.xml配置 在服务器端容器启动之前加载配置文件的顺序:context-param>listener>filter>servlet //容器配置application上下文的时候加载的文件 //这是spring容器的配置文件 <context-param> <param-name>contextConfigLocation</param-na…

@SuppressWarnings注解详细解析
注解屏蔽一些错误警告,但不是代码错误,这个注解可以提高代码的安全性,防止为了解决这个错误警告而造成不可估量的后果。

Oracle timestamp 转换 date
2019独角兽企业重金招聘Python工程师标准>>> --第一种 select dt0 from table--第二种 select cast(dt as date) from table 转载于:https://my.oschina.net/chenhao901007/blog/383345

2021全国高校计算机能力挑战赛(初赛)C语言试题二
写一个程序统计从1到N这N个数中,以下三个条件至少满足之一的数字x个数。 #include <stdio.h>int isprime(int m) {int f 1;for (int i 2; i < m / 2; i) {if (m % i 0) {f 0;break;}}return f; }int isse(int m) {int f 1;if (m % 7 ! 0)f 0;return …

用Sketchup和Vray学习室内设计
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确) |大小解压后:7 GB 含课程文件 |时长:10h 18m 3D设计入门指南 你会学到什么 学习高效建模所需的Sketchup技能。 了解虚拟…

Android 悬浮窗口
Android 悬浮窗口 一.创建悬浮窗口步骤 1.实现一个ViewGroup类,作为悬浮窗口的界面类,以便在里面重写onInterceptTouchEvent和onTouchEvent方法,实现移动界面的目的. 在本例中实现了一个FloatLayer类,可以作为通用的类,使用时需要传入WindowManager对象以实现移动窗口…

Java多线程复习:1(进程和线程、并发和并行)
进程和线程 进程 我们电脑中每一个运行着的程序都是一个进程,程序一旦运行就是进程。 进程可以视为程序的一个实例,大部分程序可以同时运行多个实例进程(如:浏览器、记事本、画图等),也有的程序只能启动一…

新年新技术:MongoDB 3.0
前一篇介绍了HTTP/2,这一篇简单介绍下3月3号发布的MongoDB 3.0。 What’s new in MongoDB 3.0? 新的存储引擎WiredTiger MongoDB 3.0的存储引擎是插件式的,默认为新增的WiredTiger。WiredTiger相比原来的MMAPv1引擎的优点: 文档级别的锁这个…

2021全国高校计算机能力挑战赛(初赛)C语言试题四
肯德基有一种奇怪的优惠券,卷上的金额都是整数。活动要求找到3张优惠券总额恰好是商品本身。 #include<stdio.h> int main() {int p,n,f0,temp0;scanf("%d %d",&p,&n);int a[10000];for (int i 0; i < n; i) {scanf("%d",&am…

Substance Painter实时角色制作视频教程
持续时间2h 包含项目文件 1920X1080 MP4 语言:英语中文字幕(机译) 大小:5.63G Substance Painter实时角色制作视频教程 信息: 本教程旨在为一个实时角色解决实体画师中纹理化现实人类皮肤的奥秘! 在这个2小时的全叙述…

Java多线程复习:2(线程的创建和使用)
线程的创建和使用 方法一,直接使用Thread import lombok.extern.slf4j.Slf4j; /*** author:小关同学爱吃汉堡* date: 2021/4/1 23:27*/ Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {//以匿名内部…

Apache htaccess 重写假设文件存在!
假设文件 data/cache/index.html 存在。那么才重写。否则使用默认的MVC 重写。by default.fufoxmail.com RewriteEngine on RewriteCond %{DOCUMENT_ROOT}/data/cache/list_1.html -f RewriteRule ^game\/?$ data/cache/list_1.html [L] RewriteCond %{REQUEST_FILENAME} !-f …

Xamarin只言片语系列
把自己写xamarin中的一些知识点记录下来,分享给大家,欢迎指正。Xamarin只言片语1——Xamarin下的弹框Xamarin只言片语2——Xamarin下的web api操作更新中……

2021全国高校计算机能力挑战赛(初赛)C语言
3-2空间中有N个顶点(顶点坐标用x,y,z表示),从中找出能构成三角形图形的最大面积,输出该面积。 #include<stdio.h> #include<math.h> int main() {int n,m0;double a,b,c,p,res[1000],s[1000][3];scanf("%d"…

藤摇椅游戏道具制作全流程讲解视频教程
藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 含工程素材 语言:英语中文字幕(根据原英文字幕机译更准确)原英文字幕 |时长:25节课(9h 57m) |大小:8.35 GB 通过模拟游…

SpringBoot复习:2(@Configuration注解)
Configuration注解 Configuration注解的作用是代替以前我们使用的xml配置文件,被注解的类就是配置类,其内部包含有一个或多个被Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类…

C/C++中constkeyword
今天在做一个趋势笔试题的时候。才让我有了系统把constkeyword好好总结一下的冲动,由于这个关键词大大小小好多地方都出现过,出现频率很高,而每次仅仅是简短的把答案看了一下,没有真正将其整个使用方法弄透,立即要找工…

hdu5185 dp:和为n且满足后一项是前一项或者+1的数列个数
其实是很裸的dp,竟然放在第四题 dp[i][j]表示当前放j和为i的方案数 dp[0][0]1; dp[i][j]dp[i-j][j-1]dp[i-j][j]; 1 #include<stdio.h>2 #include<string.h>3 #include<math.h>4 #include<algorithm>5 using namespace std;6 int dp[50005]…

2021全国高校计算机能力挑战赛(决赛)Java
计算奖品价格标准差 import java.util.*;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();float sum0;int total_n0;int[] numnew int[10];float[] prinew float[10];for (int i 0; i <n ; i) {num[i…

Python训练营2021:构建8个真实世界的Python项目
时长:19h 27m |视频:. MP4,1280720 30 fps |音频:AAC,44.1 kHz,2ch |大小:9.54 GB 语言:英语中英文字幕 机译 从Python Web开发的初学者到专家:学习使用SQLite、Tkinter开发真实的Django应用程序 你会学到: 了解如何使用像Djang…

SpringBoot复习:3(@Conditional)
Conditional 条件装配:满足Conditional指定的条件时,则进行组件注入 Conditional注解下面包含许多注解,如下图: 这些注解各有各的功能,这里挑几个来记录一下。 ConditionalOnBean注解 个人理解:当该注…

HDU——1106排序(istringstream的使用、STLvector练习)
排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 46057 Accepted Submission(s): 13221 Problem Description输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用…

AssertValid函数学习
转自http://tsitao.blog.163.com/blog/static/29795822006914105840496/ VC的调试中,AssertValid和Dump函数的应用 CObject::AssertValid 成员函数提供对对象内部状态的运行时检查。虽然从 CObject 派生类时不须要重写 AssertValid,但能够通过重写使您的…
数值分析第一次作业-牛顿迭代法求解二元非线性方程组
1、问题 求解如下方程组: 2、算法 3、代码实现 # *coding:utf-8 * import math delta 5e-6 ;eps 1e-6 x0 1;y0 1 er 1;k 0 def z(x,y):return math.sin(x*y)*math.exp(-0.1*(x**2y**2x*y2*x)) def f(x,y):return y*math.cos(x*y)-0.1*(2*xy2)*math.sin(x*y) def g(x,y…