个人资料,仅供学习使用
修改时间——2022年1月25日 22:09:17
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚

22 视频文件摄像头使用

opencv知识点:

  • VIdeoCapture类
  • 读取视频/相机 - 三种方式
  • 读取视频帧 - 两种方式

本文所解决的问题:

  • 如何读取视频/相机?
  • 如何读取视频帧?

本课所解决的问题:

1.VideoCapture类以及视频读操作

引用文章:opencv学习—VideoCapture 类基础知识

在opencv中,
关于视频的读操作是通过VideoCapture类来完成的;
关于视频的写操作是通过VideoWriter类来实现的。

读取视频/相机

当我们要读取一个视频文件,或者相机时,一般有3种方式

  • 从文件中读取视频

视频捕获对象创建以后,OpenCV将会打开文件并做好准备读取它。
如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true。
(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)

VideoCapture capture(const string& filename);  // 从视频文件读取
VideoCapture capture("D:/WorkSpace/Opencv/videos/mouse.mp4");  // 从视频文件读取
  • 从摄像机中读取视频。

这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。
对于摄像机而言,这个标志符就是一个标志数字

  • 如果只有1个摄像机,那么就是0
  • 如果系统中有多个摄像机,那么只要将其向上增加即可。
VideoCapture capture(0);  //从摄像机读取
  • 先创建一个视频捕获对象,然后通过成员函数open来设定打开的信息。
VideoCapture capture;
VideoCapture.open("D:/WorkSpace/Opencv/videos/mouse.mp4");

读取视频捕获对象的视频帧

将视频帧读取到Mat矩阵中,一般有两种方式:

  • 一种是read()操作
  • 另一种是 “>>”操作。
Mat frame;
cap.read(frame); //读取方式一
cap >> frame; //读取方式二  相当于输入流,cap流入frame中

2.对摄像头和视频进行读取

本文采取的方式为,

  • 先利用VideoCapture创建视频捕获对象
  • 再使用其方法read获取帧

现在我们对read方法进行解释

read抓取,解码并返回下一个视频帧共1个参数第1个参数 视频帧的输出图像

读取摄像头

这里简要说一下摄像头,本文只实现了对1个摄像头的读取

如果果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可

不过我们要注意一点:

虽然摄像机将在 VideoCapture 析构函数中自动取消初始化,但我们最好在末尾写上release,
相机是关键资源,要确保被释放
当然,视频文件更要在末尾写上release

我们先来试一下摄像头

//函数定义
void video_demo(Mat& image);//函数实现
void QuickDemo::video_demo(Mat& image) {VideoCapture cap(0);//0表示,对摄像头进行捕获;Mat frame;while (true) {cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame//对视频读取时,同图像一样会有判空操作if (frame.empty()) {break;}//因为摄像头是镜像的,所以我们要左右翻转一下flip(frame, frame, 1);/*read获得的视频帧也是图像,如果我们想进行一些操作,之前的方法也都适用,如色彩空间转换等*/imshow("frame", frame);int c = waitKey(1);//一般是1,相当于每秒1000张图片if (c == 27) {break;}}cap.release();
}

读取视频文件

我们再试一下视频文件

void QuickDemo::video_demo(Mat& image) {VideoCapture cap("D:/WorkSpace/Opencv/videos/mouse.mp4");//读取视频文件Mat frame;while (true) {cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame//对视频读取时,同图像一样会有判空操作if (frame.empty()) {break;}/*read获得的视频帧也是图像,如果我们想进行一些操作,之前的方法也都适用,如色彩空间转换等*/imshow("frame", frame);int c = waitKey(1);if (c == 27) {break;}}
}

3.对读取的视频帧进行操作

这里演示一下,调用我们之前写的colorSpace_Demo();

void QuickDemo::video_demo(Mat& image) {VideoCapture cap("D:/WorkSpace/Opencv/videos/mouse.mp4");//读取视频文件Mat frame;while (true) {cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame//对视频读取时,同图像一样会有判空操作if (frame.empty()) {break;}colorSpace_Demo(frame);imshow("frame", frame);int c = waitKey(1);if (c == 27) {break;}}
}

本课所用API查阅

1.VideoCapture——构造和析构

2.VideoCapture——其他方法

3.VideoCapture——详细说明

从视频文件、图像序列或相机中捕获视频的类。

该类提供 C++ API 用于从摄像机捕获视频或读取视频文件和图像序列。

以下是如何使用该类:

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{Mat frame;//--- 初始化视频捕捉VideoCapture cap;// 使用默认 API 打开默认相机// cap.open(0);// 或提前使用:选择任何 API 后端int deviceID = 0;             // 0 = 打开默认摄像头int apiID = cv::CAP_ANY;     // 0 = 自动检测默认 API// 使用选定的 API 打开选定的相机cap.open(deviceID, apiID);// 检查我们是否成功if (!cap.isOpened()) {cerr << "ERROR! Unable to open camera\n";return -1;}//--- 抓取和写入循环cout << "Start grabbing" << endl<< "Press any key to terminate" << endl;for (;;){// 等待来自相机的新帧并将其存储到“帧”中cap.read(frame);// 检查我们是否成功if (frame.empty()) {cerr << "ERROR! blank frame grabbed\n";break;}// 实时显示并等待一个超时时间足够长的键来显示图像imshow("Live", frame);if (waitKey(5) >= 0)break;}// 摄像机将在 VideoCapture 析构函数中自动取消初始化return 0;
}

3.VideoCapture::read

【个人笔记】OpenCV4 C++ 快速入门 22课相关推荐

  1. 【个人笔记】OpenCV4 C++ 快速入门 20课

    个人资料,仅供学习使用 修改时间--2022年1月24日 22:09:02 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 20 图像翻转 opencv知识点: 图像翻转 - ...

  2. 【个人笔记】OpenCV4 C++ 快速入门 14课

    个人资料,仅供学习使用 修改时间--2022年2月13日 09:47:32 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 14 图像几何形状绘制 opencv知识点: 四种几 ...

  3. 【个人笔记】OpenCV4 C++ 快速入门 10课

    个人资料,仅供学习使用 修改时间--2022年2月10日 10:29:12 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 10 图像像素的逻辑操作 opencv知识点: 绘制 ...

  4. 【个人笔记】OpenCV4 C++ 快速入门 29课

    个人资料,仅供学习使用 修改时间--2022年2月19日 15:02:27 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 29 高斯双边模糊 opencv知识点: 高斯双边模 ...

  5. 【个人笔记】OpenCV4 C++ 快速入门 26课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:49:07 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 26 直方图均衡化 opencv知识点: 均衡灰度图 ...

  6. 【个人笔记】OpenCV4 C++ 快速入门 25课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:45:23 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 25 二维直方图 opencv知识点: 计算直方图数 ...

  7. 【个人笔记】OpenCV4 C++ 快速入门 23课

    个人资料,仅供学习使用 修改时间--2022年1月26日 00:49:43 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 23 视频处理与保存 opencv知识点: Vide ...

  8. 【个人笔记】OpenCV4 C++ 快速入门 19课

    个人资料,仅供学习使用 修改时间--2022年1月24日 20:17:13 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 19 图像放缩与插值 opencv知识点: 图像放缩 ...

  9. 【个人笔记】OpenCV4 C++ 快速入门 17课

    个人资料,仅供学习使用 修改时间--2022年1月23日 17:59:14 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 17 鼠标操作与响应 opencv知识点: 设置指定 ...

最新文章

  1. Powershell 命令行泄漏下一个 Windows 10 更新内容
  2. 开发日记-20190711 关键词 Perl的后续学习
  3. 开始学习RED HAT LINUX了
  4. 如何模拟鼠标的拖拽行为.
  5. 镭威视监控怎么复位_三大原因导致海康威视、大华股份近期连续暴跌
  6. 【活动(北京)】Global Azure Bootcamp
  7. P4139-上帝与集合的正确用法【欧拉定理】
  8. python代数式的表达方式_关于python字典类型最疯狂的表达方式
  9. 辗转相除法(欧几里得算法)求解最大公约数、最小公倍数
  10. 为dhcp服务器授权的作用,有关在 AD DS 中为 DHCP 服务器授权的详细信息
  11. RColorBrewer | R语言中的配色方法汇总(Ⅰ)
  12. 为什么excel图片会变成代码_会EXCEL便可定制自己的办公管理软件(超简单,无代码)...
  13. 【POJ】【3164】Commond Network
  14. 数据预处理和数据特征工程
  15. pip慢?半分钟解决方案
  16. 完美解决 vcpkg 下载速度慢
  17. Euraka学习笔记
  18. tiny210 ubuntu下sd卡分区
  19. Linux下使用ISC DHCP可以实现动态推送静态路由表
  20. Fleck实现简单的Websocket

热门文章

  1. python定时模块:apscheduler
  2. 一名网工对Linux运维的一次经历
  3. redis的默认配置文件redis.conf详解
  4. Swift 4 和 Objective-C 在同一个工程里的混搭编程的方法
  5. AutoCADDCL对话框设计示例八
  6. 构建基于Hibernate的servlet(1)
  7. java 如何处理正则
  8. 计算机网络知识学习(核心:网络协议)-- 应用层
  9. java多张图片合成一张_利用溶图技巧把多张图片合成一张奇幻风格图片教程
  10. 最具发展前景的8大行业,IT行业排第一!