opencv学习—VideoCapture 类基础知识「建议收藏」

2022-08-03 10:21:44 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

以下是对两位大神的博客进行简单整理得到:http://blog.csdn.net/weicao1990/article/details/53379881

http://blog.csdn.net/guduruyu/article/details/68486063

便于为需要的同学解惑,便于自己以后复习!

在opencv中关于视频的读操作是通过VideoCapture类来完成的;关于视频的写操作是通过VideoWriter类来实现的。

<一>—VideoCapture—视频的获取操作

VideoCapture既支持从视频文件(.avi , .mpg格式)读取,也支持直接从摄像机(比如电脑自带摄像头)中读取。要想获取视频需要先创建一个VideoCapture对象,VideoCapture对象的创建方式有以下三种: cop

【方式一】是从文件(.MPG或.AVI格式)中读取视频,对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。

代码语言:javascript复制
方法:  cv::VideoCapture capture(const string& filename);  // 从视频文件读取 例程:  cv::VideoCapture capture("C:/Users/DADA/DATA/gogo.avi");  // 从视频文件读取 

【方式二】是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。标识符另外一部分是摄像机域(camera domain),用于表示摄像机的类型,这个域值可以是下面任一预定义常量。

  1. [cpp] view plain
  2. cv::VideoCapture capture(int device ); //视频捕捉设备 id —笔记本电脑的用0表示

以这种方式创建视频捕获对象时,我们所传递的标识符是域索引和摄像机索引的和。例如:

[cpp] view plain copy

  1. cv::VideoCapture capture(cv::CAP_IEEE1394 1);

这个例子中VideoCapture将尝试打开第2个(编号从0开始)1394摄像机。多数情况下,由于我们只有一个摄像机,因此没必要指定摄像机的域,此时使用cv::CAP_ANY是一种高效的方式(也即是0,所以不用特意指定)。

【方式三】先创建一个捕获对象,然后通过成员函数open()来设定打开的信息,操作如下。

[cpp] view plain copy

  1. cv::VideoCapture VideoCapture; 这里的第二个VideoCapture是一个对象名
  2. VideoCapture.open( “C:/Users/DADA/DATA/gogo.avi“ );

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

[cpp] view plain copy

  1. cv::Mat frame;
  2. cap.read(frame); //读取方式一
  3. cap >> frame; //读取方式二

下面是读取视频并显示的示例代码:

[cpp] view plain copy

  1. // 示例代码1
  2. #include <opencv2/opencv.hpp>
  3. #include <iostream>
  4. mian()
  5. {
  6. cv::VideoCapture capture(“C:/Users/DADA/DATA/gogo.avi“);
  7. if (!capture.isOpened())
  8. {
  9. std::cout << “Read video Failed !” << std::endl;
  10. return;
  11. }
  12. cv::Mat frame;
  13. cv::namedWindow(“video test”);
  14. int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);
  15. std::cout << “total frame number is: “ << frame_num << std::endl;
  16. for (int i = 0; i < frame_num – 1; i)
  17. {
  18. capture >> frame;
  19. //capture.read(frame); 第二种方式
  20. imshow(“video test”, frame);
  21. if (cv::waitKey(30) == ‘q’)
  22. {
  23. break;
  24. }
  25. }
  26. cv::destroyWindow(“video test”);
  27. capture.release();
  28. return 0;
  29. }
  30. 示例代码2
  31. #include <iostream>
  32. #include <opencv2/core/core.hpp>
  33. #include <opencv2/highgui/highgui.hpp>
  34. int main(int argc,char* argv[])
  35. {
  36. cv::VideoCapture capture(argv[1]);
  37. if(!capture.isOpened())
  38. {
  39. std::cout<<“video not open.”<<std::endl;
  40. return 1;
  41. }
  42. //获取当前视频帧率
  43. double rate = capture.get(CV_CAP_PROP_FPS);
  44. //当前视频帧
  45. cv::Mat frame;
  46. //每一帧之间的延时
  47. //与视频的帧率相对应
  48. int delay = 1000/rate;
  49. bool stop(false);
  50. while(!stop)
  51. {
  52. if(!capture.read(frame))
  53. {
  54. std::cout<<“no video frame”<<std::endl;
  55. break;
  56. }
  57. //此处为添加对视频的每一帧的操作方法
  58. int frame_num = capture.get(CV_CAP_PROP_POS_FRAMES);
  59. std::cout<<“Frame Num : “<<frame_num<<std::endl;
  60. if(frame_num==20)
  61. {
  62. capture.set(CV_CAP_PROP_POS_FRAMES,10);
  63. }
  64. cv::imshow(“video”,frame);
  65. //引入延时
  66. //也可通过按键停止
  67. if(cv::waitKey(delay)>0)
  68. stop = true;
  69. }
  70. //关闭视频,手动调用析构函数(非必须)
  71. capture.release();
  72. return 0;
  73. }

上面的代码,我们使用了cv::VideoCapture的成员函数get()并设定标识cv::CAP_PROP_FRAME_COUNT获取了读取视频的帧总数。同样,我们可以指定其他标识,来获取读取视频或摄像头的其他属性。另外,我们也可以使用成员函数set(),设定相应属性的值。cv::VideoCapture中提供的属性标识如下图所示。

下面是该类的API。 1.VideoCapture类的构造函数: C : VideoCapture::VideoCapture() C : VideoCapture::VideoCapture(const string& filename) C : VideoCapture::VideoCapture(int device) 功能:创建一个VideoCapture类的实例,如果传入对应的参数,可以直接打开视频文件或者要调用的摄像头。 参数: filename – 打开的视频文件名。 device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。 2.VideoCapture::open 功能:打开一个视频文件或者打开一个捕获视频的设备(也就是摄像头) C : bool VideoCapture::open(const string& filename) C : bool VideoCapture::open(int device) 参数: filename – 打开的视频文件名。 device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。 通过对VideoCapture类的构造函数和open函数分析,可以发现opencv读入视频的方法一般有如下两种。比如读取当前目录下名为”dog.avi”的视频文件,那么这两种写法分别如下。 (1)先实例化再初始化: VideoCapture capture; capture.open(“dog.avi”); (2)在实例化的同时进行初始化: VideoCapture(“dog.avi”); 3.VideoCapture::isOpened C : bool VideoCapture::isOpened() 功能:判断视频读取或者摄像头调用是否成功,成功则返回true。 4.VideoCapture::release C : void VideoCapture::release() 功能:关闭视频文件或者摄像头。 5.VideoCapture::grab C : bool VideoCapture::grab() 功能:从视频文件或捕获设备中抓取下一个帧,假如调用成功返回true。(细节请参考opencv文档说明) 6.VideoCapture::retrieve C : bool VideoCapture::retrieve(Mat& image, int channel=0) 功能:解码并且返回刚刚抓取的视频帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。 7.VideoCapture::read C : VideoCapture& VideoCapture::operator>>(Mat& image) C : bool VideoCapture::read(Mat& image) 功能:该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频帧这是一个最方便的函数对于读取视频文件或者捕获数据从解码和返回刚刚捕获的帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。 从上面的API中我们会发现获取视频帧可以有多种方法 : // 方法一 capture.read(frame); // 方法二 capture.grab(); // 方法三 capture.retrieve(frame); // 方法四 capture >> frame; 8.VideoCapture::get C : double VideoCapture::get(int propId) 功能:一个视频有很多属性,比如:帧率、总帧数、尺寸、格式等,VideoCapture的get方法可以获取这些属性。 参数:属性的ID。 属性的ID可以是下面的之一: CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds or video capture timestamp. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 – start of the film, 1 – end of the film. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. CV_CAP_PROP_FPS Frame rate. CV_CAP_PROP_FOURCC 4-character code of codec. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). CV_CAP_PROP_HUE Hue of the image (only for cameras). CV_CAP_PROP_GAIN Gain of the image (only for cameras). CV_CAP_PROP_EXPOSURE Exposure (only for cameras). CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. CV_CAP_PROP_WHITE_BALANCE Currently not supported CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently) Note: 如果查询的视频属性是VideoCapture类不支持的,将会返回0。 9.VideoCapture::set C : bool VideoCapture::set(int propertyId, double value) 功能:设置VideoCapture类的属性,设置成功返回ture,失败返回false。 参数:第一个是属性ID,第二个是该属性要设置的值。 属性ID如下: CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 – start of the film, 1 – end of the film. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. CV_CAP_PROP_FPS Frame rate. CV_CAP_PROP_FOURCC 4-character code of codec. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). CV_CAP_PROP_HUE Hue of the image (only for cameras). CV_CAP_PROP_GAIN Gain of the image (only for cameras). CV_CAP_PROP_EXPOSURE Exposure (only for cameras). CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. CV_CAP_PROP_WHITE_BALANCE Currently unsupported CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124988.html原文链接:https://javaforall.cn

0 人点赞