opencv中读写视频
1、介绍 OpenCV 读写视频之前,先介绍一下编解码器(codec) 。如果是图像文件, 我们可以根据文件扩展名得知图像的格式。但是此经验并不能推广到视频文件中。 有些 OpenCV 用户会碰到奇怪的问题, 都是 avi 视频文件, 有的能用 OpenCV打开,有的不能。 视频的格式主要由压缩算法决定。压缩算法称之为编码器(coder) ,解压算法称之为解码器(decoder) ,编解码算法可以统称为编解码器(codec) 。视频文件能读或者写,关键看是否有相应的编解码器。编解码器的种类非常多,常用的有 MJPG、XVID、DIVX 等,完整的列表请参考 FOURCC 网站3。因此视频文件的扩展名(如 avi 等)往往只能表示这是一个视频文件。 OpenCV 2 中提供了两个类来实现视频的读写。 读视频的类是 VideoCapture,写视频的类是 VideoWriter。
2、读视频
VideoCapture 既可以从视频文件读取图像,也可以从摄像头读取图像。可以使用该类的构造函数打开视频文件或者摄像头。如果 VideoCapture 对象已经创建,也可以使用 VideoCapture::open()打开,VideoCapture::open()函数会自动调用VideoCapture::release()函数,先释放已经打开的视频,然后再打开新视频。
如果要读一帧, 可以使用 VideoCapture::read()函数。 VideoCapture 类重载了>>操作符,实现了读视频帧的功能。下面的例程演示了使用 VideoCapture 类读视频。
#include<iostream>
#include"opencv2/opencv.hpp"
#include<stdio.h>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
//打开摄像头
VideoCapture cap(0);
//打开视频文件
//VideoCapture cap("video.short.raw.avi");
//检查是否成功打开
if (!cap.isOpened())
{
cerr << "can not open a camera or file."<<endl;
return -1;
}
Mat edges;
//创建窗口
namedWindow("edges",1);
for (;;)
{
Mat frame;
//从cap中读一帧,存到frame
cap >> frame;
//如果未读到图像
if (frame.empty())
break;
//将读到的图像转为灰度图
cvtColor(frame,edges,CV_BGR2GRAY);
//进行边缘提取操作
Canny(edges,edges,0,30,3);
//显示结果
imshow("edges",edges);
//等待30s,如果按键则退出循环
if (waitKey(30) >= 0)
break;
}
//退出时会自动释放 cap 中占用资源
return 0;
}
3、写视频
使用 OpenCV 创建视频也非常简单,与读视频不同的是,你需要在创建视频时设置一系列参数,包括:文件名,编解码器,帧率,宽度和高度等。编解码器使用四个字符表示,可以是 CV_FOURCC('M','J','P','G')、CV_FOURCC('X','V','I','D')及CV_FOURCC('D','I','V','X')等。 如果使用某种编解码器无法创建视频文件, 请尝试其他的编解码器。
将图像写入视频可以使用 VideoWriter::write()函数,VideoWriter 类中也重载了<<操作符,使用起来非常方便。另外需要注意:待写入的图像尺寸必须与创建视频时指定的尺寸一致。
下面例程演示了如何写视频文件。本例程将生成一个视频文件,视频的第 0帧上是一个红色的“0” ,第 1 帧上是个红色的“1” ,以此类推,共 100 帧。生成视频的播放效果如图 4.3 所示。
#include<iostream>
#include"opencv2/opencv.hpp"
#include<stdio.h>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
//定义视频的宽度和高度
Size s(320, 240);
//创建writer,并制定FOURCC及FPS等参数
VideoWriter writer = VideoWriter("myvedio.avi",CV_FOURCC('M','J','P','G'),25,s);
//检查是否成功创建
if (!writer.isOpened())
{
cerr << "Can not create video file.\n"<<endl;
return -1;
}
//视频帧
Mat frame(s,CV_8UC3);
for (int i = 0; i < 100; i++)
{
//将图像置为黑色
frame = Scalar::all(0);
//将整数i转为i字符串类型
char text[128];
sprintf_s(text,"%d",i);
//将数字绘到画面上
putText(frame,text,Point(s.width/3,s.height/3),FONT_HERSHEY_SCRIPT_SIMPLEX,3,Scalar(0,0,255),3,8);
//将图像写入视频
writer << frame;
}
VideoCapture cap("myvedio.avi");
for (int i = 0; i < 100; i++)
{
Mat frame;
//从 cap 中读一帧,存到 frame
cap >> frame;
//如果未读到图像
if (frame.empty())
break;
//显示结果
imshow("frame", frame);
waitKey(1000);
}
//退出程序时自动关闭视频文件
waitKey(0);
return 0;
}
opencv中读写视频的更多相关文章
- opencv中的视频的读入
#include"stdafx.h"#include"opencv2/opencv.hpp" using namespace cv;int g_slider_p ...
- opencv 从摄像头中读取视频并保存(c++版)
原文:http://blog.csdn.net/zhongshijunacm/article/details/68947890 OpenCV中的视频操作函数如下表所列: VideoCapture Vi ...
- OpenCV读写视频文件解析(二)
OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...
- OpenCV读写视频文件解析
OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...
- [OpenCV-Python] OpenCV 中视频分析 部分 VI
部分 VI视频分析 OpenCV-Python 中文教程(搬运)目录 39 Meanshift 和 和 Camshift 目标 • 本节我们要学习使用 Meanshift 和 Camshift 算法在 ...
- 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- Opencv从文件中播放视频
1.VideoCapture()括号中写视频文件的名字,在播放每一帧的时候,使用cv2.waitKey()设置适当的持续时间,太低会播放的很快,太高会很慢,通常情况下25毫秒就行了. 2.获取相机/视 ...
- OpenCV图像处理与视频分析详解
1.OpenCV4环境搭建 VS2017新建一个控制台项目 配置包含目录 配置库目录 配置链接器 配置环境变量 重新启动VS2017 2.第一个图像显示程序 main.cpp #include< ...
- [zt]OpenCV如何获取视频当前的一帧图像
(OpenCV读取视频.OpenCV提取视频每一帧.每一帧图片合成新的AVI视频)CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture* cap; IplIm ...
随机推荐
- New Concept English three (50)
31 39 The New Year is a time for resolutions. Mentally, at least, most of us could compile formidabl ...
- canvas基础学习(二)
一.图像绘制 canvas绘制图像的方法是ctx.drawImage();该方法有三种使用方式 1.ctx.drawImage(img,x,y); img是指图像对象,x和y分别是这个图像左上角在ca ...
- 网络编程基础--协程--greenlet切换---gevent自动识别 IO ---
协程: 1 单线程来实现并发---协程: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 只 ...
- python_函数中使用*和**
Python在函数中,使用*接收元组,使用**接收键/值对 当要使函数接收元组或字典形式的参数 的时候,有一种特殊的方法,它分别使用*和**前缀 .这种方法在函数需要获取可变数量的参数 的时候特别有用 ...
- BZOJ3302: [Shoi2005]树的双中心
BZOJ3302: [Shoi2005]树的双中心 https://lydsy.com/JudgeOnline/problem.php?id=3302 分析: 朴素算法 : 枚举边,然后在两个连通块内 ...
- 类和对象(12)—— this指针
首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针: ...
- angularjs控制输入框只输入数字及最多输入两位小数
ps:示例中作用在循环中,其它的你可以按实际需求进行修改使用 <input type="text" ng-model="item.productNumber&quo ...
- FastAdmin 的 Bootstrap-Table 如何合并字段?
FastAdmin 的 Bootstrap-Table 如何合并字段? ★hey-成都 14:13:34 把下面那个字段合并到上面那个字段是用什么方法 ^★暗物质-江西 14:17:21 city加上 ...
- VC 6.0下载 VC 6.0英文版下载 Visual C++ 6.0 英文企业版 集成SP6完美版(最新更新地址,百度网盘)
下载地址1:Visual.C++.6.EN 下载地址2:Visual.C++.6.EN 更新下载地址可用(百度网盘)Visual.C++.6.EN 转载请注明出处,有技术问题,欢迎互相交流,或者留言.
- VS2013 中使用 CxImage 库时用Unicode编码时出现链接错误
CxImage 本身是支持Unicode 编码的,编译CxImage库的时候选择编译Unicode就可以了,得到的lib文件和dll文件很容易看出有个u的就是Unicode编码的 当然在使用的时候要对 ...