一、视频读取

cv::VideoCapture既支持视频文件的读取,也支持从摄像机中视频的读取。cv::VideoCapture对象的创建方式有以下三种:
方式一:
    cv::VideoCapture capture(
    const string& filename, // 输入视频文件路径名
    );

方式二:
    cv::VideoCapture capture(
    int device // 输入摄像机视频捕捉设备 id
    );
从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0(cv::CAP_ANY),如果系统中有多个摄像机,那么只要将其向上增加即可。

enum      cv::VideoCaptureAPIs {cv::CAP_ANY = 0,cv::CAP_VFW = 200,cv::CAP_V4L = 200,cv::CAP_V4L2 = CAP_V4L,cv::CAP_FIREWIRE = 300,cv::CAP_FIREWARE = CAP_FIREWIRE,cv::CAP_IEEE1394 = CAP_FIREWIRE,cv::CAP_DC1394 = CAP_FIREWIRE,cv::CAP_CMU1394 = CAP_FIREWIRE,cv::CAP_QT = 500,cv::CAP_UNICAP = 600,cv::CAP_DSHOW = 700,cv::CAP_PVAPI = 800,cv::CAP_OPENNI = 900,cv::CAP_OPENNI_ASUS = 910,cv::CAP_ANDROID = 1000,cv::CAP_XIAPI = 1100,cv::CAP_AVFOUNDATION = 1200,cv::CAP_GIGANETIX = 1300,cv::CAP_MSMF = 1400,cv::CAP_WINRT = 1410,cv::CAP_INTELPERC = 1500,cv::CAP_REALSENSE = 1500,cv::CAP_OPENNI2 = 1600,cv::CAP_OPENNI2_ASUS = 1610,cv::CAP_GPHOTO2 = 1700,cv::CAP_GSTREAMER = 1800,cv::CAP_FFMPEG = 1900,cv::CAP_IMAGES = 2000,cv::CAP_ARAVIS = 2100,cv::CAP_OPENCV_MJPEG = 2200,cv::CAP_INTEL_MFX = 2300,cv::CAP_XINE = 2400
}

比如: cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);  表示将尝试打开第2个(编号从0开始)1394摄像机。

方式三:先创建一个捕获对象,然后通过成员函数open()来设定打开的信息。
    cv::VideoCapture capture;
    capture.open( "my_video.avi" );

cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。

二、视频读取

视频帧读取到cv::Mat矩阵中,有两种方式:
一种是read()操作
    cv::Mat frame;
    cap.read(frame); 
另一种是 “>>”操作。
    cv::Mat frame;
    cap >> frame;

三、设置和获取摄像头属性参数

比如设置属性参数, bool VideoCapture::set(int propertyId, double value),设置成功返回ture,失败返回false。参数:第一个是属性ID,第二个是该属性要设置的值。

 capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度 capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度capture.set(CV_CAP_PROP_FPS, 30);//帧率 帧/秒capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50capture.set(CV_CAP_PROP_HUE, 50);//色调 50capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50capture.set(CV_CAP_PROP_FOURCC, 50);//FOURCC编解码器的4个字符代码。capture.set(CV_CAP_PROP_POS_AVI_RATIO,0);//视频文件的相对位置:0-胶片开始,1-胶片结束。capture.set(CV_CAP_PROP_CONVERT_RGB,1);//表示图像是否应转换为RGB的布尔标志capture.set(CV_CAP_PROP_RECTIFICATION,1);//立体摄像机的整流标志(注意:只有当前支持DC1394 v 2.x后端)

比如获取属性参数, double VideoCapture::get(int propId),参数:第一个是属性的ID。如果查询的视频属性是VideoCapture类不支持的,将会返回0。

 int nFrameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH);int nFrameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);double fFrameRate = capture.get(CV_CAP_PROP_FPS);int nBrightness = capture.get(CV_CAP_PROP_BRIGHTNESS);int nContrast = capture.get(CV_CAP_PROP_CONTRAST);int nSaturation = capture.get(CV_CAP_PROP_SATURATION);int nHue = capture.get(CV_CAP_PROP_HUE);int nExposure = capture.get(CV_CAP_PROP_EXPOSURE);double fFrameCount = capture.get(CV_CAP_PROP_FRAME_COUNT);//总帧数
double fFramePos = capture.get(CV_CAP_PROP_POS_FRAMES);//视频帧号,0-based index of the frame to be decoded/captured next.
double fTimestamp = capture.get(CV_CAP_PROP_POS_MSEC);//时间戳(毫秒),position of the video file in milliseconds or video capture timestamp.
int ex = static_cast<int>(capture.get(CV_CAP_PROP_FOURCC));//获取FOURCC4个字符表示的视频编码器格式
// Transform from int to char via Bitwise operators
char EXT[] = {(char)(ex & 0XFF),(char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24),0};
如果是MPEG4编码,ex为0x7634706d,EXT为mp4v
如果是H264编码,ex为0x31637661,EXT为avc1
如果是H265编码,ex为0x31637662,EXT为avc2
CV_FOURCC获取编码格式:
cv.VideoWriter.fourcc(‘P’, ‘I’, ‘M’, ‘1’) 表示 MPEG-1 codec
cv.VideoWriter.fourcc(‘M’, ‘J’, ‘P’, ‘G’) 表示 motion-jpeg codec
cv.VideoWriter.fourcc(‘M’, ‘P’, ‘4’, ‘2’) 表示 MPEG-4.2 codec
cv.VideoWriter.fourcc(‘D’, ‘I’, ‘V’, ‘3’) 表示 MPEG-4.3 codec
cv.VideoWriter.fourcc(‘D’, ‘I’, ‘V’, ‘X’) 表示 MPEG-4 codec
cv.VideoWriter.fourcc(‘U’, ‘2’, ‘6’, ‘3’) 表示 H263 codec
cv.VideoWriter.fourcc(‘I’, ‘2’, ‘6’, ‘3’) 表示 H263I codec
cv.VideoWriter.fourcc(‘F’, ‘L’, ‘V’, ‘1’) 表示 FLV1 codec

四、设置视频帧的读取位置

VideoCapture类的set方法可以允许我们取出视频中某个位置的帧,它有一些参数,可以按时间,也可以按帧号,还可以按视频长短的比例。

double position=100.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);//帧号double position=10000;
capture.set(CV_CAP_PROP_POS_MSEC,position);//时间戳位置(毫秒)double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);//视频1/2位置

五、关闭视频文件或者摄像头。

VideoCapture::release()

六、实例

1、读取本地视频文件或网络视频文件。

#include<opencv2/opencv.hpp>
using namespace cv;void main(){VideoCapture cap;cap.open("d:\\test.mp4");//cap.open("http://xxx/test.mp4");//http视频url地址if(!cap.isOpened())//如果视频不能正常打开则返回return;Mat frame;while(true){cap>>frame;//等价于cap.read(frame);if(frame.empty())//如果某帧为空则退出循环break;imshow("video", frame);waitKey(25);//每帧延时25毫秒}cap.release();//释放资源
}

2、读取摄像头视频

#include<opencv2/opencv.hpp>
using namespace cv;void main(){//打开摄像机设备cv::VideoCapture cap= cv::VideoCapture(0);//先设置采集格式cap.set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));//再设置高清采集分辨率cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);if(!cap.isOpened())return;Mat frame;while(1){cap>>frame;if(frame.empty())break;imshow("video", frame);if(waitKey(25)>0)//按下任意键退出摄像头break;}cap.release();destroyAllWindows();//关闭所有窗口
}

七、注意事项

1、OpenCV3和OpenCV2类似,视频的读、写操作,分别通过cv::VideoCapture和cv::VideoWriter两个类来实现。
2、使用opencv中 “cv::VideoCapture” 函数,无法读取本地文件;报错内容显示:报错:cv::CvCapture_Images::open CAP_IMAGES: Stop scanning. Can 或者“Read video Failed”。解决方法:将opencv视频解码依赖ffmpeg库拷贝到当前目录下即可。比如:opencv_videoio_ffmpeg455_64.dll(455_64表示opencv库的版本)
由于OpenCV对视频进行处理时,只能处理.avi格式的文件。不能打开.mp4格式的文件。需要将opencv安装包的opencv_ffmpeg.dll或opencv_videoio_ffmpeg版本号xxx.dll文件拷贝到相应的工程文件夹内就可以支持.mp4文件了。
3、打开摄像头高分辨率下有时延:在缺省情况下用VideoCapture打开摄像头,小分辨率640x480可以实时显示,但1920x1080时就会有将近1秒多的时延。
解决方法一:
可以设置缓存区大小。使用设置属性接口将buffersize改小,使得高分辨率下也可以实时显示。

capture.set(CV_CAP_PROP_BUFFERSIZE,1);

解决方法二:
很多摄像头,在YUV2输出格式高分辨率的情况下都不到15帧,以MJPG输出格式解码能达到30帧。

//打开摄像机设备
cv::VideoCapture cap= cv::VideoCapture(0);
//先设置采集格式
cap.set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
//再设置高清采集分辨率
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

4、VideoCapture打开网络视频文件目前只支持http格式和rtsp格式网络视频文件。

OpenCV VideoCapture使用方法(视频文件、摄像头、网络视频文件)相关推荐

  1. AVPlayer播放视频(本地视频,或网络视频)

    https://github.com/potato512/SYAVPlayer 使用AVPlayer播放本地视频,或网络视频,需要添加AVFoundation框架. 使用AVPlayer播放视频的优势 ...

  2. matlab的许可证文件路径,网络许可证文件 - MATLAB Simulink - MathWorks 中国

    在网络许可证文件内 网络许可证文件是一种特殊格式的 ASCII 文本文件,其中包含您有权运行的每个产品的加密产品密码.每个产品密码用于确认适合该产品的密钥数.网络许可证管理器可授予或拒绝对某产品的访问 ...

  3. 《TencentNCNN系列》 之bin文件(网络参数文件)格式分析

    #PS:要转载请注明出处,本人版权所有 #PS:这个只是 < 我自己 >理解,如果和你的 #原则相冲突,请谅解,勿喷 时间:2018.07.18 ncnn master commit id ...

  4. hutool 读取扩展名文件_Python OpenCV视觉智能感知第一讲——读取摄像头或视频文件并播放显示...

    Python OpenCV视觉智能感知 第一讲--读取摄像头或视频文件并播放显示 本部分内容将深入.全面.详细地介绍如何使用Anaconda Python和OpenCV读取摄像头或视频文件,并进行播放 ...

  5. Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频

    Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频 前期准备 在之前的博文,Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 ...

  6. android视频自动旋转,Android 使用PLDroidPlayer播放网络视频 根据视频角度自动旋转...

    最近因为项目需求 ,需要播放网络视频 ,于是乎 研究了一番 ,说说我遇到的那些坑 现在市面上有几个比较主流好用的第三方框架 当然还有很多别的视频播放框架 因为我只找到这几个= =! 因为项目比较急,所 ...

  7. Android 使用PLDroidPlayer播放网络视频 依据视频角度自己主动旋转

    近期由于项目需求 .须要播放网络视频 .于是乎 研究了一番 ,说说我遇到的那些坑 如今市面上有几个比較主流好用的第三方框架 Vitamio ( 体积比較大,有商业化风险 github:https:// ...

  8. 网络电视服务器是什么系统,网络视频直播系统

    网络视频直播系统可以应客户的要求把活动现场的音频或视频信号经压缩后,传送到多媒体服务器上,在Internet上供广大网友或授权特定人群收听或收看. 现在网络直播系统分:直播软件或是硬件直播,硬件直播的 ...

  9. TW特别策划:网络视频麻将局,谁会最先胡【详细】

    据 相关数据显示2008年上半年,视频分享已经跻身主流媒介,成为中国网民上网重要去处.且视频网站的前两名已占据了视频分享市场有效浏览时间78.3%的 市场份额.视频分享市场垄断局面已经成型的同时使得竞 ...

最新文章

  1. 解决“The type initializer for'Oracle.DataAccess.Client.OracleConnection' threw an exception ”异常...
  2. mysql distinct、group_concat
  3. Docker最全教程——从理论到实战(二)
  4. 如何把朋友升级成情侣?| 今日最佳
  5. 【新书速递】你想知道的通信“灵魂三问”都在这里……(福利再现)
  6. dd命令安装Linux
  7. tensorflow之random_normal
  8. ASP.NET MVC 3 RC2 更新的内容
  9. 4.RabbitMQ 安装
  10. 一个简单的爬虫例子(代码)
  11. Android入门,android基础开发
  12. 基于stm32 ESP8266WiFi模块的基本通信
  13. [论文写作-词汇] 这么多特别,该用哪个?special especial specific particular peculiar exceptional extraordinary
  14. 2020年,生活从“不易”开始
  15. 新胖子公式(java)
  16. 坐飞机时为什么不能说一路顺风
  17. 华为社招嵌入式软件面试_华为社招面试感受 痛苦 悲催
  18. Python数据结构——对有序表二分查找
  19. Linux系统命令详解
  20. Solving environment: failed ResolvePackageNotFound: - ld_impl_linux-64==2.34=h53a641e_4

热门文章

  1. Chrome打开网页不慢,但是卡顿,滚动滚轮卡顿,打开b站等特定网址卡顿问题解决
  2. 微信网页开发——随手笔记
  3. Flink CDC 新一代数据集成框架
  4. CentOS 7.6源码编译安装gluster 6.1
  5. 全面解析软文营销中的八大技巧
  6. UNIX 系统家族树的详细历史(图)
  7. android多国语言---简写对应国家code
  8. 防火墙、DCD与TCP Keep alive
  9. JVM各内存区域存放内容
  10. 优化服务器卡顿,如何解决国外服务器卡顿问题