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

这篇具有很好参考价值的文章主要介绍了OpenCV VideoCapture使用方法(视频文件、摄像头、网络视频文件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、视频读取

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);//亮度 1
 capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
 capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
 capture.set(CV_CAP_PROP_HUE, 50);//色调 50
 capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50
 capture.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格式网络视频文件。文章来源地址https://www.toymoban.com/news/detail-458131.html

到了这里,关于OpenCV VideoCapture使用方法(视频文件、摄像头、网络视频文件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv从视频文件读取视频内容,从摄像头读取保存视频内容

    (1)argparse模块使编写用户友好的命令行接口变得容易。 (2)程序定义了它需要的参数,而argparse将找出如何从sys.argv中解析这些参数。 (3)argparse模块还会自动生成帮助和使用消息,并在用户给程序提供无效参数时发出错误信息。 import argparse # 导入库 parser = argparse.Argume

    2024年02月22日
    浏览(57)
  • Jetson Orin Nano使用OpenCV获取视频帧率和帧数的方法

    首先确认下视频的播放时间 使用cv库来获取帧率和帧数,测试代码如下 python3运行结果,30fps,总帧数807 计算验证,fps含义,多少帧frame每秒,视频的时间就等于总帧数/fps,807/30=26.9s,符合我们最开始看到的视频时间 Jetson Orin Nano使用OpenCV获取视频帧率和帧数的方法

    2024年01月21日
    浏览(73)
  • OpenCV保存摄像头视频和视频文件操作实战(附Python源码)

    需要源码和视频请点赞关注收藏后评论区留言私信~~~ 在实际开发过程中,很多时候希望保存一段视频,为此,OpenCV提供了VideoWriter类,下面先熟悉一下里面的各种方法 VideoWriter类的常用方法包括它的构造方法,write方法和release方法 语法如下 VideoWriter object=cv2.VideoWriter(filename

    2024年02月07日
    浏览(64)
  • OpenCV 视频处理(关于摄像头和视频文件的读取、显示、保存等等)

    OpenCV不仅能够处理图像,还能够处理视频 视频是由大量的图像构成的 ,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到处理视频的目的。要想处理视频,需要先对视频进行读取、显示、保存等相关操作。为此

    2024年03月14日
    浏览(50)
  • Opencv(C++)系列学习---读取视频文件和打开摄像头

    今天学习的这两个内容比较简单,话不多说,直接上代码! 目录 【1】读取视频文件 【2】摄像头读取视频 运行结果:  这段代码较为简单,有兴趣的同学也可以挑战一下,在视频读取上加个进度条,可以通过鼠标拖动进度条到指定位置,像平时我们用的视频播放器一样,主

    2024年02月16日
    浏览(52)
  • opencv基础: 视频,摄像头读取与保存的常用方法

    当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。 上面有三种构造方法, 第一种是无法构造方法。 第二种参数device是一个数字。 一般笔记本如此写cv2.VideoCapture(0); 因为默认是0 ,如果有多个摄像头,就需要看设置的摄像头代表的数字了。 第二种

    2024年02月09日
    浏览(43)
  • 树莓派摄像头使用方法

       打开之后,重启树莓派:sudo reboot  输入以下指令,可以使用树莓派摄像头的拍照功能:  树莓派拍摄照片保存到指定文件夹,下面的例子将照片保存在了/home/pi/httpHeadler/ 也可以通过system函数调用拍照命令。

    2024年02月14日
    浏览(46)
  • OpenCV(视频加载与摄像头使用)

    目录 1、VideoCapture类 2、视频属性get()  3、视屏文件保存

    2024年02月12日
    浏览(53)
  • 使用OpenCV调用摄像头和读取视频图片

    要捕获视频,你需要创建一个 VideoCapture 对象。它的参数是设备索引的名称。设备索引就是指定哪个摄像头的数字。正常情况下,内部摄像头可以通过传入0来调用,传递1来选择外置的第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。 直

    2024年02月08日
    浏览(53)
  • 【OpenCV常用函数:视频捕获函数】cv2.VideoCapture

    输入视频路径,创建VideoCapture的对象 该类的函数有: 1)video.isOpened: 检查视频捕获是否成功 2)video.read(): 读取视频帧,返回ret, frame,ret为bool类型,表示是否成功 3)video.release(): 关闭视频 4)video.get(prop): 获取video的属性 如果要读取视频的每一帧,然后进行相关的处理时,可

    2024年02月13日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包