22 视频文件摄像头使用

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("C:/Users/LZQ/Desktop/皮克斯动画开头.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;
		}
	}
}

76b69ebc9eb3ad9fa02f56780d5bfa8

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 cameran";
        return -1;
    }
    
    //--- 抓取和写入循环
    cout << "Start grabbing" << endl<< "Press any key to terminate" << endl;
    for (;;)
    {
        // 等待来自相机的新帧并将其存储到“帧”中
        cap.read(frame);
        
        // 检查我们是否成功
        if (frame.empty()) {
            cerr << "ERROR! blank frame grabbedn";
            break;
        }
      // 实时显示并等待一个超时时间足够长的键来显示图像
        imshow("Live", frame);
        if (waitKey(5) >= 0)
            break;
    }
  // 摄像机将在 VideoCapture 析构函数中自动取消初始化
    return 0;
}

3.VideoCapture::read

原文链接: https://www.cnblogs.com/L707/p/17051894.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    22 视频文件摄像头使用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/311960

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午12:13
下一篇 2023年2月16日 下午12:13

相关推荐