opencv--读写视频

opencv2与opencv3

入门opencv首先了解下读取视频文件、摄像头的编程风格。
opencv2、opencv3对此最基本到区别莫过于操作图像矩阵的不同:

  • opencv2采用到是IplImage指针;
  • opencv3采用的是Mat矩阵。

区别:

  1. 保存图像信息的结构体:
    opencv2:CvCapture,操作清一色指针。
    opencv3:VideoCapture,操作清一色变量。

  2. 打开到函数:
    opencv2:cvCreateCameraCapture(-1)读入摄像头视频,
    cvCreateFileCapture(“路径”)读入视频文件。
    opencv3:open一个函数搞定,文件和摄像头是不同的重载函数。

  3. IplImage指针、Mat变量

  4. 读取视频流的形式:
    opencv2:cvQueryFrame(capture)
    opencv3:<<,经过重载到operate函数。

  5. 图像显示:
    opencv2:在main一开头声明窗口:cvNamedWindow,后面用cvShowImage函数显示
    opencv3:imshow全部搞定,美滋滋。当然,cvNamedWindow也有它到代替品:namedWindow();

  6. 控制帧率
    opencv2:cvWaitKey
    opencv3:waitKey

  7. 释放保存图像信息到结构体
    opencv2:cvReleaseCapture()函数
    opencv3:作为一个变量,显然是由系统释放到,完全不需要管。不过严谨起见,也可以加上一行capture.release();

编解码器(codec)

介绍 OpenCV 读写视频之前,先介绍一下编解码器(codec)。

如果是图像文件,我们可以根据文件扩展名得知图像的格式。但是此经验并不能推广到视频文件中。有些 OpenCV 用户会碰到奇怪的问题,都是 avi 视频文件,有的能用 OpenCV打开,有的不能。

视频的格式主要由压缩算法决定。
压缩算法称之为编码器(coder),解压算法称之为解码器(decoder),编解码算法可以统称为编解码器(codec)。
视频文件能读或者写,关键看是否有相应的编解码器。编解码器的种类非常多,常用的有 MJPG、XVID、DIVX等,完整的列表请参考 FOURCC 网站 3 。因此视频文件的扩展名(如 avi 等)往往只能表示这是一个视频文件

OpenCV 2 中提供了两个类来实现视频的读写。

  1. 读视频的类是 VideoCapture
  2. 写视频的类是 VideoWriter

读视频

VideoCapture 既可以从视频文件读取图像,也可以从摄像头读取图像。可以使用该类的构造函数打开视频文件或者摄像头。如果 VideoCapture 对象已经创建,也可以使用 VideoCapture::open()打开,VideoCapture::open()函数会自动调用VideoCapture::release()函数,先释放已经打开的视频,然后再打开新视频。

如果要读一帧,可以使用 VideoCapture::read()函数。VideoCapture 类重载了>>操作符,实现了读视频帧的功能。
下面的例程演示了使用 VideoCapture 类读视频。

int main(int argc,char ** argv) {
    //打开一个摄像头
	//VideoCapture cap(0);

	//打开一个视频
	VideoCapture cap("D:\\wait.mp4");
	if (!cap.isOpened()) {
		cerr << " can not open a camera or file" << endl;
		return -1;
	}

	Mat edges;
	namedWindow("Waityou", 1);
	for (;;) {
		Mat frame;
		//从cap中读出一帧  存放在frame
		cap >> frame;

		//如果未读到图像
		if (frame.empty()) {
			break;
		}
		//将读到的图片转化成灰度图
		cvtColor(frame, edges, CV_BGR2GRAY);
		//进行边缘提取操作
		Canny(edges, edges, 0, 15, 3);
		//显示结果
		imshow("edges", edges);
		if (waitKey(30) >= 0)
			break;
	}
	//退出时自动会释放cap中占有的资源
	return 0;
}

写视屏

使用 OpenCV 创建视频也非常简单,与读视频不同的是,你需要在创建视频时设置一系列参数,包括:文件名,编解码器,帧率,宽度和高度等。
编解码器使用四个字符表示,可以是 CV_FOURCC(‘M’,‘J’,‘P’,‘G’)、CV_FOURCC(‘X’,‘V’,‘I’,‘D’)及CV_FOURCC(‘D’,‘I’,‘V’,‘X’)等。如果使用某种编解码器无法创建视频文件,请尝试其他的编解码器。
将图像写入视频可以使用 VideoWriter::write()函数,VideoWriter 类中也重载了<<操作符,使用起来非常方便。另外需要注意:待写入的图像尺寸必须与创建视频时指定的尺寸一致。

下面例程演示了如何写视频文件。

#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
	//定义视频的宽度和高度
	Size s(320, 240);
	//创建 writer,并指定 FOURCC 及 FPS 等参数
	VideoWriter writer = VideoWriter("D:\\test\\myvideo.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];
		snprintf(text, sizeof(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;
	}
	//退出程序时会自动关闭视频文件
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41498261/article/details/83870667