OpenCV学习笔记二:从文件或网络摄像头中载入视频
Posted single-use waste
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV学习笔记二:从文件或网络摄像头中载入视频相关的知识,希望对你有一定的参考价值。
学习了从网络摄像头或已有的视频文件载入视频。
两种途径一样的地方在于:
1、先导入cv2库
2、定义捕捉对象。
从网络摄像头中载入
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow("frame", frame)
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
code:cap = cv2.VideoCapture(0)
这个函数的功能是从摄像头中载入视频帧,括号里面的0代表是来自第一个网络摄像头,如果是来自第二个的话,把0变成1,以此类推。
这里使用while循环,ret, frame = cap.read(),如果cap读入一个帧,那么ret的值是True,否则是false,结束循环。
imshow的使用就和笔记一的图片一样。
key = cv2.waitKey(1)
if key == 27:
break
上面的代码是判断键入的键是什么,27对应的是Ese,如果键入Ese的话,就跳出循环,结束执行。
从文件中载入
import cv2
cap = cv2.VideoCapture("red_panda_snow.mp4")
while True:
ret, frame = cap.read()
cv2.imshow("frame", frame)
key = cv2.waitKey(25)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
同样,这里也使用cv2.VideoCapture()功能函数,只是括号里面的内容和前面从网络摄像头载入不一样了。
如果,视频文件就在python脚本的同一文件夹中,()里面只需要填写视频的文件名。
比如,上面所展示的那样:cap = cv2.VideoCapture("red_panda_snow.mp4")
如果,视频文件在电脑桌面或其他地方(和笔记一中图片是一个道理),那么()里填写路径和视频的文件名。
比如,cap = cv2.VideoCapture(r"C:\\Users\\MYUSER\\Documents\\red_panda_snow.mp4")
值得注意的是,这个前面最好加上r,因为有时候python会把里面的 \\字母 认为是转义字符。
就像这样,会出现橙色的玩意
但如果加上r,就好了,变成赏心悦目的绿色了
运行代码,就开始播放视频(按Ese才可以关掉,右上角的叉叉不可以)
从文件中载入视频,做适当处理后保存该视频
import cv2
cap = cv2.VideoCapture("red_panda_snow.mp4")
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("flipped_red_panda.avi", fourcc, 25, (640, 360))
while True:
ret, frame = cap.read()
frame2 = cv2.flip(frame, 1)
cv2.imshow("frame2", frame2)
cv2.imshow("frame", frame)
out.write(frame2)
key = cv2.waitKey(25)
if key == 27:
break
out.release()
cap.release()
cv2.destroyAllWindows()
在之前从文件中载入视频的基础上增加了一些代码,达到将视频水平翻转并保存的效果。
code:fourcc = cv2.VideoWriter_fourcc(*"XVID")
fourcc是Four-Character Codes(四字符代码),因而括号里需要填入四个字符。
一般写作cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),该参数是MPEG-4编码类型,文件名后缀为.avi。
上面的例子中,使用python中*操作符的用法(*用于参数前面,表示传入的参数将按照元组的形式存储),达到相同效果。
code:out = cv2.VideoWriter("flipped_red_panda.avi", fourcc, 25, (640, 360))
cv2.VideoWriter()
第一个参数"flipped_red_panda.avi"是要保存的文件名。第二个参数fourcc是指定编码器。都三个参数25是要保存的视频的帧率。第四个参数(640, 360)要保存的文件的画面尺寸。
code:frame2 = cv2.flip(frame, 1)
cv2.flip(filename, flipcode)
filename:需要操作的图像。flipcode:翻转方式 1为水平翻转。
最后将原视频所有的帧水平翻转后,写入out。
效果如下:
原文链接:Loading Video and Webcam - OpenCV 3.4 with python 3 Tutorial 2 - Pysource
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学习笔记二:从文件或网络摄像头中载入视频的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenCV Python 从 Android 智能手机捕获视频