【从零学习OpenCV】 视频数据的读取&摄像头的直接调用

重磅干货,第一时间送达

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

1

01

视频数据的读取

虽然视频文件是由多张图片组成的,但是imread()函数并不能直接读取视频文件,需要由专门的视频读取函数进行视频读取,并将每一帧图像保存到Mat类矩阵中,代码清单2-27中给出了VideoCapture类在读取视频文件时的构造方式。

代码清单2-27 读取视频文件VideoCapture类构造函数
cv :: VideoCapture :: VideoCapture(); //默认构造函数
cv :: VideoCapture :: VideoCapture(const String& filename,
                                         int apiPreference =CAP_ANY
                                         )
  • filename:读取的视频文件或者图像序列名称

  • apiPreference:读取数据时设置的属性,例如编码格式、是否调用OpenNI等,详细参数及含义在表2-5给出。

该函数是构造一个能够读取与处理视频文件的视频流,在代码清单2-27中的第一行是VideoCapture类的默认构造函数,只是声明了一个能够读取视频数据的类,具体读取什么视频文件,需要在使用时通过open()函数指出,例如cap.open(“1.avi”)是VideoCapture类变量cap读取1.avi视频文件。

第二种构造函数在给出声明变量的同时也将视频数据赋值给变量。可以读取的文件种类包括视频文件(例如video.avi)、图像序列或者视频流的URL。其中读取图像序列需要将多个图像的名称统一为“前缀+数字”的形式,通过“前缀+%02d”的形式调用,例如在某个文件夹中有图片img_00.jpg、img_01.jpg、img_02.jpg……加载时文件名用img_%02d.jpg表示。函数中的读取视频设置属性标签默认的是自动搜索合适的标志,所以在平时使用中,可以将其缺省,只需要输入视频名称即可。与imread()函数一样,构造函数同样有可能读取文件失败,因此需要通过isOpened()函数进行判断,如果读取成功则返回值为true,如果读取失败,则返回值为false。

通过构造函数只是将视频文件加载到了VideoCapture类变量中,当我们需要使用视频中的图像时,还需要将图像由VideoCapture类变量里导出到Mat类变量里,用于后期数据处理,该操作可以通过“>>”运算符将图像按照视频顺序由VideoCapture类变量复制给Mat类变量。当VideoCapture类变量中所有的图像都赋值给Mat类变量后,再次赋值的时候Mat类变量会变为空矩阵,因此可以通过empty()判断VideoCapture类变量中是否所有图像都已经读取完毕。

VideoCapture类变量同时提供了可以查看视频属性的get()函数,通过输入指定的标志来获取视频属性,例如视频的像素尺寸、帧数、帧率等,常用标志和含义在表2-5中给出。

表2-5 VideoCapture类中get方法中的标志参数

标志参数

简记

作用

CAP_PROP_POS_MSEC

0

视频文件的当前位置(以毫秒为单位)

CAP_PROP_FRAME_WIDTH

3

视频流中图像的宽度

CAP_PROP_FRAME_HEIGHT

4

视频流中图像的高度

CAP_PROP_FPS

5

视频流中图像的帧率(每秒帧数)

CAP_PROP_FOURCC

6

编解码器的4字符代码

CAP_PROP_FRAME_COUNT

7

视频流中图像的帧数

CAP_PROP_FORMAT

8

返回的Mat对象的格式

CAP_PROP_BRIGHTNESS

10

图像的亮度(仅适用于支持的相机)

CAP_PROP_CONTRAST

11

图像对比度(仅适用于相机)

CAP_PROP_SATURATION

12

图像饱和度(仅适用于相机)

CAP_PROP_HUE

13

图像的色调(仅适用于相机)

CAP_PROP_GAIN

14

图像的增益(仅适用于支持的相机)

为了更加熟悉VideoCapture类,在代码清单2-28中给出了读取视频,输出视频属性,并按照原帧率显示视频的程序,运行结果在图2-6给出。

代码清单2-28 VideoCapture.cpp读取视频文件
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
system("color F0"); //更改输出界面颜色
VideoCapture video("cup.mp4");
if (video.isOpened())
{
cout << "视频中图像的宽度=" << video.get(CAP_PROP_FRAME_WIDTH) << endl;
cout << "视频中图像的高度=" << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
cout << "视频帧率=" << video.get(CAP_PROP_FPS) << endl;
cout << "视频的总帧数=" << video.get(CAP_PROP_FRAME_COUNT);
}
else
{
cout << "请确认视频文件名称是否正确" << endl;
return -1;
}
while (1)
{
Mat frame;
video >> frame;
if (frame.empty())
{
break;
}
imshow("video", frame);
waitKey(1000 / video.get(CAP_PROP_FPS));
}
waitKey();
return 0;
}

图2-6 读取视频程序运行结果

1

02

摄像头的直接调用

VideoCapture类还可以调用摄像头,构造方式如代码清单2-29中所示。

代码清单2-29 VideoCapture类调用摄像头构造函数
cv :: VideoCapture :: VideoCapture(int index,
                                         int apiPreference = CAP_ANY
                                         )

通过与代码清单2-27中对比,调用摄像头与读取视频文件相比,只有第一个参数不同。调用摄像头时,第一个参数为要打开的摄像头设备的ID,ID的命名方式从0开始。从摄像头中读取图像数据的方式与从视频中读取图像数据的方式相同,通过“>>”符号读取当前时刻相机拍摄到的图像。并且读取视频时VideoCapture类具有的属性同样可以使用。我们将代码清单2-28中的视频文件改成摄像头ID(0),再次运行代码清单2-28的程序,运行结果如图2-7所示。

图2-7 调用摄像头程序运行结果

(0)

相关推荐

  • [opencv]吊诡的摄像头黑屏

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

  • OpenCV-Python学习教程.2

    如果你用Linux得设备,可能会用到这里来看有没有设备被安全挂载.因为没有一个图形化的页面来方便的查看. 子Linux不是太好使 # 获取视频帧的宽w = fcap.get(cv2.CAP_PROP_ ...

  • OpenCV或yolov4使用IPCamera进行目标检测——真正的随时检测

    IP camera 我们在手机的应用市场上搜索 IP camera就可以找到这个软件 Tips: 这款APP是有广告的注意不要乱点广告,略影响用户体验. 考虑开发一个更好的 网络环境 需要确定你的手机 ...

  • 【视频教程】对视频进行基本操作

    今天看了场直播,偶然想到自己数据处理有文本.图像,但是大数据时代数据不止文本和图像,还有音频和视频.由于之前接触了OpenCV,我觉得视频是连续的图片组成的,还是比较好理解. 呃,说的很高大上.其实很 ...

  • 成功解决AttributeError: module 'cv2.cv2' has no attribute 'CV_CAP_PROP_FPS'和 'CV_CAP_PROP_FRAME_WIDTH'

    成功解决AttributeError: module 'cv2.cv2' has no attribute 'CV_CAP_PROP_FPS'和 'CV_CAP_PROP_FRAME_WIDTH' 解 ...

  • Python进阶——OpenCV之GUI

    文章目录 图像处理(Getting Started with Images) 读取图像 显示图像 保存图像 使用Matplotlib 视频处理(Getting Started with Videos) ...

  • Python Opencv捕获视频

    先得安装这个opcv的库 注意选择的Python解释器 我这里还有一个解释器,是thonny的IDE的 装好以后可以看看版本 会发现是可以自动补全的 我们可以在本地的时候放一个图片,读取一下 impo ...

  • OpenCV-Python学习教程.1

    本次用到的是一款DELL的摄像头,比较便宜.因为自带的摄像头不太方便 先来一张捕获到的照片.虽然不太清晰但是已经够用了 因为最近做图形算法比较多,所以对cv2熟悉是必然的,倒是和以前的函数差不多,就是 ...

  • python+opencv图像处理(十九)

    视频的读入和显示 在图像处理中,视频处理是其中的重要一环,本篇介绍视频的读入和显示. 1.视频读入 Opencv中有自带的函数可以实现视频的读入和显示,代码如下: 视频其实也就是一帧一帧的图像,所以在 ...

  • 【从零学习OpenCV】保存和读取XML和YMAL文件

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】图像读取函数imread

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV】图像的保存&视频的保存

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】这4种读取Mat类元素的的方法你都知道么?

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】深度神经网络应用实例

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】图像修复

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Mean-Shift分割算法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Grabcut图像分割

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——分水岭法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...