OpenCV读取视频和图像序列

在使用OpenCV时候,我们首先会做的是获取待处理的图像,这个图像可能来源于已存储的视频文件、也可能来源于实时的摄像头画面、或是某个文件夹下的一系列图片。或许你会觉得,这都是小菜一碟,因为我们学习OpenCV的第一步一般是学习如何加载和显示一幅图片。对于打开摄像头或是读取视频的程序,网上也是一抓一大把。如果你是初学者,不妨看一下我下面的总结,或许有你不曾注意到的。

对于图像或视频的加载、显示、窗口设置、工具条、图像合并为视频、视频分割成图像、打开视频或摄像头等操作的定义是放在OpenCV的highGui模块中的,说到这,还是建议初学者尽量多看看opencv2refman.pdf这个文件,你会对opencv的结构更清晰。下面仅就图像和视频的读取和显示方面做探究。

1.读图像

OpenCV可以读取哪些格式的图片?如何读取?

在OpenCV中,对于单幅图像的读取,我们一般使用imread()函数,先看下面一段代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat img;

	//img = imread("images//frame_0001.jpg");
	img = imread("images//frame_0001.jpg",0);

	if (img.empty())
	{
		cout<<"cannot load image"<<endl;
		return 0;
	}

	//namedWindow("image");

	imshow("image",img);
	waitKey(0);
	return 0;
}

对于使用红蓝颜色加亮的代码,你可以尝试一下,看看有什么不同?你会发现namedWindow("image");有没有这句都是一样的,而imread第二参数不同将显示出不同的图像,一个是原图,另一个是灰度图。为什么呢,我们不妨看一下imread()函数接口:

C++: Mat imread(conststring& filename, int flags=1 )

Parameters

filename – Name of file tobe loaded.

flags – Flags specifyingthe color type of a loaded image:

– >0 Return a 3-channelcolor image.

Note: In the currentimplementation the alpha channel, if any, is stripped from the

output image. Use negativevalue if you need the alpha channel.

– =0 Return a grayscaleimage.

– <0 Return the loadedimage as is (with alpha channel).</span>

可以看到filename中存放的是图片的名字,如果图片不在本项目文件下,必须给出图片的绝对路径。对于flags参数有三种取值,取值为0时输出为灰度图,取值大于0时输出值为三通道图像,如果你需要带有alpha通道的图像,则必须使用负值参数。
我们知道图片的封装格式有好多种,比如jpg,bmp,png,但OpenCV可以读取哪些呢?其实在不同的操作系统下使用OpenCV时,可以读取图像的种类还是有区别的。在opencv2refman.pdf这个文档中对这个还是有些介绍的:
The function imread loads an image from the specified file and returns it. If the image cannot be read (because
of missing file, improper permissions, unsupported or invalid format), the function returns an empty matrix
( Mat::data==NULL ). Currently, the following file formats are supported:
? Windows bitmaps - *.bmp, *.dib (always supported)
? JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)
? JPEG 2000 files - *.jp2 (see the Notes section)
? Portable Network Graphics - *.png (see the Notes section)
? Portable image format - *.pbm, *.pgm, *.ppm (always supported)
? Sun rasters - *.sr, *.ras (always supported)
? TIFF files - *.tiff, *.tif (see the Notes section)
另外,在windows和linux下使用OpenCV读取图像时还是有一定区别的,不管格式还是OpenCV的配置,但这些内容会留在OpenCV移植相关章节中去详述。
2.读视频
OpenCV中有一个专门读取摄像头或者视频文件的类,叫VideoCapture,这个类的功能很强大,建议初学者参考opencv2refman.pdf来学习,我们先来看一段代码
 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat img;
	VideoCapture cap(0);
	if (!cap.isOpened())
	{
		cout<<"cannot open camera"<<endl;
		return 0;
	}
	while (true)
	{
		cap >> img;
		imshow("image",img);
		waitKey(30);
	}
	return 0;
}

这是读取视频时最常用的方法,使用<<号称是最方便快捷的方法。
以上的的这些内容是你在OpenCV的开发手册上可以看到的,但有一些在实际开发中很常见的,而开发手册中却没有的,来看看吧:
 
3. 读取图片文件夹
我们从一些数据库中下载下来的测试数据,有些是视频文件,而有些是一帧帧的图片,比如下图中的这种情况:
 
我该如何设计程序,才能方便的去让程序逐个读取这些图片文件呢?我们可能会首先排除VideoCapture类,我们认为他只能读取视频文件或者摄像头。我们一般会选择使用imread函数,只是我们必须在读取下一帧图片时更换filename参数,其实这样也不难,我们可以尝试将每个图片的文件名按顺序存放在一个文本文件中,然后可以从文本文件中逐个提取文件名。我们还可以将数字转化为字符串,再与frame_和,jpg结合在一块租出文件名,我第一次碰到这个问题时曾经尝试了很多方法,但一次在OpenCV的samples中我发现原来OpenCV可以使用VideoCapture类读取图像序列的。看下面一段代码:
 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	string first_file = "images//frame_%04d.jpg";
	VideoCapture sequence(first_file);

	if (!sequence.isOpened())
	{
		cerr << "Failed to open the image sequence!\n" << endl;
		return 1;
	}

	Mat image;
	namedWindow("Image sequence", 1);

	for(;;)
	{

		sequence >> image;

		if(image.empty())
		{
			cout << "End of Sequence" << endl;
			break;
		}

		imshow("Image sequence", image);
		waitKey(0);
	}

	return 0;
}

是不是一个很好的方法!其实VideoCapture可以做的事还有很多,包括读取流媒体文件,网络摄像头等,这个暂且就不说了!会在以后章节中涉及!

OpenCV读取视频和图像序列

时间: 07-02

OpenCV读取视频和图像序列的相关文章

Linux OpenCV读取视频失败,cvCreateFileCapture失败的解决

背景: 最近想在嵌入式平台上开发QT+Opencv,无料PC机上编写的OpenCV程序老是打不开视频. 开始提示:OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize 但是没有用错.考虑到可能没有打开视频,以作为cvGetSize的参数. 以前程序运行没有问题,最近电脑进行了一些FFMPEG/ZLIB等的交叉编译,就不能运行了. 解决方法: 网上搜索,发现是因为ffmpeg没有编译到opencv里.

【探索OpenCV】OpenCV读取视频文件

OpenCV读取视频文件之前需要做是事情: 1.下载视频编码解码器 推荐XviD,下载链接:http://pan.baidu.com/s/1jGjE2ii 密码:xrni 2.用格式工厂将视频文件转成标准格式,如*.avi /*----------------------------------------OpenCV视频读取代码---------------------------------------------*/ CString Filepath; CFileDialog dlg(TR

python+opencv读取视频,调用摄像头

引用 import cv2 import numpy 创建摄像头对象 cap = cv2.VideoCapture("videoTest/test1.mp4") #参数为视频文件目录 逐帧显示实现视频播放 while 1: ret, frame = cap.read() #读取 cv2.imshow("capture", frame) #显示 if cv2.waitKey(100) & 0xff == ord('q'): #按q退出 break 释放摄像头对

Opencv 读取视频,随播放滚动的视频条,canny检测。

实现视频条的拖动需要使用全局变量g_slider_position,和回调函数onTrackbarSlider(). 拖动条由函数cvCreateTrackbar()函数产生,具体调用为: 1 cvCreateTrackbar("position", 2 "Original", 3 &g_slider_position, 4 frames, 5 onTrackbarSlider); 6 } “position” 为拖动条名称,“Original”为显示窗口名

python+opencv读取视频并设置可调整窗口大小

import cv2 cap = cv2.VideoCapture('data/1.mp4') while cap.isOpened(): ret, frame = cap.read() # 调整窗口大小 cv2.namedWindow("frame", 0) # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直 cv2.resizeWindow("frame", 1600, 900) # 设置长和宽 cv2.imshow('frame', frame)

OpenCV3读取视频或摄像头

我们可以利用OpenCV读取视频文件或者摄像头的数据,将其保存为图像,以用于后期处理.下面的实例代码展示了简单的读取和显示操作: 1 // This is a demo introduces you to reading a video and camera 2 #include <iostream> 3 #include <string> 4 #include <sstream> 5 using namespace std; 6 7 // OpenCV include

opencv学习之路(2)、读取视频,读取摄像头

一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open("1.avi"); B. VideoCapture cap("1.avi"); ②循环显示每一帧: while(1) { Mat frame; //定义Mat变量,用来存储每一帧 cap>>frame; //读取当前帧方法一 //cap.read(frame); /

在opencv下读取视频保存为图片

VideoCapture capture; capture.open("D:\\car.avi");//读取视频 对于视频下一帧的读取: capture>>frameImg;//读取视频流下一帧控制,字符重载 对于视频的图片保存 std::stringstream ss;//存储图片路径保存信息 ss<<"D:/output/image_"<<setfill('0')<<setw(3)<<(nCount-1

Opecv + Anaconda 读取视频(windows)

前言:之前一直用的是python(x,y),但是发现在使用opencv时容易出现一些pythonw.exe停止工作的问题.后来发现自己的操作系统是64位的,却安装了32位的python(x,y),虽然在此之前已经安装好theano.opencv等封装好的库,但是花了一下午时间没有解决之前出现的问题,治标不治本.因此,果断放弃治疗,选择Opecv + Anaconda .Anaconda Python 是 Python 科学技术包的合集,功能和 Python(x,y) 类似.它是新起之秀,已更新多