Qt-OpenCV学习笔记--读取视频--VideoCapture()
Posted 搞机械的假程序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt-OpenCV学习笔记--读取视频--VideoCapture()相关的知识,希望对你有一定的参考价值。
目录
一、概述
这个函数用来从本地文件或摄像头设备中读取视频。
二、函数构造
这个函数有多种重载,主要介绍常用的三种:
VideoCapture::VideoCapture();
VideoCapture::VideoCapture(const string &filename);
VideoCapture::VideoCapture(int device);
filename | 表示视频文件的路径及名称 |
device | 要打开的视频捕获设备的id。要使用默认后端打开默认相机,只需传递0。 |
三、函数方法
函数 | 方法 |
VideoCapture::open | 打开视频文件或视频获取装置 |
VideoCapture::isOpened | 判断视频文件是否正确,返回true则正确 |
VideoCapture::release | 关闭视频流文件 |
VideoCapture::grab | 抓住下一帧的视频文件或捕获设备 |
VideoCapture::retrieve | 解码并返回了视频帧 |
VideoCapture::read | 抓住,解码并返回下一个视频帧 |
VideoCapture::get | 返回指定视频类的相关参数信息 |
VideoCapture::set | 设置类信息的一个属性 |
opertor>>方法利用函数重载提取单帧图像image,read方法的输入是Mat的引用,这种方式得到的实际是VideoCapture解析得到的单帧图像的引用,当后续再读取帧时,Mat数据将会自动释放,自动更新成新的数据信息。Mat复制构造函数和赋值操作共享数据空间,当需要同时获取多帧图像源时,可以利用Mat提供的Mat::clone()方法进行复制操作。
四、测试代码
第一种方法
测试代码1
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using namespace cv;
using namespace std;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
ui->setupUi(this);
//载入视频路径
VideoCapture capture("c:/opencv/cup.mp4");
//播放标记
int i=0;
//循环读取
while (1)
//新建图像
Mat frame;
//读取当前帧(再次读取时,Mat自动释放,获取下一帧图像)
capture>>frame;
//进度显示
qDebug()<<"播放"<<i;
i++;
//播放完毕,跳出循环
if(frame.empty())
qDebug()<<"播放完毕!";
break;
//图像显示
imshow("frame",frame);
//延时50毫秒,读取下一帧视频(延时越小,播放速度越快;反之,越慢)
waitKey(50);
Widget::~Widget()
delete ui;
测试结果1
第二种方法
测试代码2
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using namespace cv;
using namespace std;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
ui->setupUi(this);
//实例对象;
VideoCapture capture;
//载入图像;
capture.open("c:/opencv/cup.mp4");
//判断是否载入成功,否则跳出
if(!capture.isOpened())
qDebug()<<"视频打开失败!";
return;
//创建矩阵
Mat frame;
//循环读取,读取完毕,自动结束
while(capture.read(frame))
//显示
imshow("frame",frame);
//延时50毫米,读取下一帧
waitKey(50);
Widget::~Widget()
delete ui;
测试结果2
五、参考
opencv图像处理学习(六十九)——VideoCapture类
opencv学习笔记02-视频读取与写入
opencv 简易笔记 2
2.视频读取和截取
import cv2
# 窗口命名
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.resizeWindow("video", 500, 500)
# 读取视频
video = cv2.VideoCapture("mdPNG/3-11 OpenCV中的TrackBar控件.mp4", cv2.CAP_FFMPEG)
# 循环读取视频,延时设置为100ms
videowriter = cv2.VideoWriter(
"mdPNG/3-11 OpenCV中的TrackBar控件_copy.mp4",
cv2.VideoWriter_fourcc(*"MJPG"),
30.0,
(1920, 1080),
isColor=False,
)
ret = True
while ret:
ret, frame = video.read()
cv2.imshow("video", frame)
videowriter.write(frame)
key = cv2.waitKey(1)
if key & 0xFF == ord("q"):
break
print(ret)
# 释放videoCapture
video.release()
videowriter.release()
cv2.destroyAllWindows()
2.1 VideoCapture(filename,api)
该方法能够读取到视频,api 无需特别指定,除非有特殊需求:
(1) filename: 文件名,0 为摄像头
(2) api: 通过 cv2.CAP 进行查看
2.2 read()->bool,mat
该方法能够读取视频帧,并有两个返回值,即状态值与当前帧
(1) bool: 状态值,正常状态为 True
(2) mat: 当前帧 mat
Tips: 当进行视频播放时,如果 waitKey 中值过小,导致视频播放速度异常,其实这是因为正常视频一般为每秒 20-25 帧左右,以 24 帧为例,正确的设置应当为 1000/24。关于如何查询原视频的帧数,可以通过 ffplay 来查看:
ffplay yourvideoname.mp4
2.2 release()->bool,mat
该方法能够释放 VideoCapture,无返回值
2.3 videoWriter(filename,fourcc,fps,framesize,iscolor)->videoWriter
该方法能够将数据写入视频,有多个参数,返回一个 videoWriter 对象,使用 write 写入 frame,最后需要释放资源。代码示例:
def create_video(filename, width, height, fps=30):
fourcc = cv2.VideoWriter_fourcc(*\'MJPG\')
video = cv2.VideoWriter(filename, fourcc, float(fps), (width, height))
video = cv2.VideoWriter(filename, fourcc, float(fps), (width, height),True)
return video
(1) filename: 保存的文件名
(2) fourcc: 编码格式,int
(3) fps: 帧率,double
(4) framesize: 宽高,格式为 size
(5) iscolor: 是否为彩色,默认为 True,最好不要操作,容易出错
以上是关于Qt-OpenCV学习笔记--读取视频--VideoCapture()的主要内容,如果未能解决你的问题,请参考以下文章