Blogger Information
Blog 143
fans 1
comment 0
visits 440300
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
opencv-OpenCV读取和写入视频文件
弘德誉曦的博客
Original
1134 people have browsed it

视频处理的是运动图像,而不是静止图像。视频资源可以是一个专用摄像机、网络摄像头、视频文件或图像文件序列。

在 OpenCV 中,VideoCapture 类和 VideoWriter 类为视频处理中所涉及的捕获和记录任务提供了一个易用的 C++API。

下方的 recVideo 示例是一个简短的代码片段,可以让你了解如何使用一个默认摄像机作为一个捕捉设备来抓取帧,对它们进行边缘检测,并且将新的转换视频帧作为一个文件保存。而且,创建两个窗口同时显示原始帧和处理过的帧。

recVideo 示例的代码为:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std;
  4. using namespace cv;
  5. int main(int, char **)
  6. {
  7. Mat in_frame, out_frame;
  8. const char win1[]="Grabbing...", win2[]="Recording...";
  9. double fps=30;//每秒的帧数
  10. char file_out[]="recorded.avi";
  11. VideoCapture inVid(O) ; //打开默认摄像机
  12. if ( !inVid.isOpened () ) { //检查错误
  13. cout << "Error! Camera not ready...\n";
  14. return -1;
  15. }
  16. //获取输入视频的宽度和高度
  17. int width = (int)inVid.get(CAP_PROP_FRAME_WIDTH);
  18. int height = (int)inVid.get(CAP_PR〇P_FRAME_HEIGHT);
  19. VideoWriter recVid(file out,VideoWriter::fourcc('M','S','V','C'), fps, Size(width, height));
  20. if (!recVid.isOpened()) {
  21. cout << "Error! Video file not opened...\n";
  22. return -1;
  23. }
  24. //为原始视频和最终视频创建两个窗口
  25. namedWindow(win1);
  26. namedWindow(win2);
  27. while (true) {
  28. //从摄像机读取帧(抓取并解码)
  29. inVid >> in frame;
  30. //将帧转换为灰度
  31. cvtColor(in_frame, out_frame, C0L0R_BGR2GRAY);
  32. //将幀写入视频文件(编码并保存)
  33. recVid << out_frame ?
  34. imshow (win1, in_frame);// 在窗口中显示帧
  35. imshow(win2, out_frame); // 在窗口中显示帧
  36. if (waitKey(1000/fps) >= 0)
  37. break;
  38. }
  39. inVid.release(); // 关闭摄像机
  40. return 0;
  41. }


在本示例中,应该快速浏览以下这些函数:

  • double VideoCapture::get(int propId):这个函数为一个 VideoCapture 对象返回指定的属性值。在 videoio.hpp 头文件中包含了基于 DC1394(IEEE 1394 数码相机规范)属性的一个完整列表。
  • static int VideoWriter::fourcc(char c1,char c2,char c3,char c4):这个函数把四个字符连接起来形成一个 fourcc 码。在示例中,MSVC 代表微软视频(仅在 Windows 上可用)。有效的 fourcc 码列表被发布在 http://www.fourcc.org/codecs.php 上。
  • bool VideoWriter::isOpened():如果写入视频的对象被成功初始化,这个函数返回 true。例如,使用一个不正确的编解码器会产生一个错误。

    注意,在一个系统中有效的 fourcc 码依赖于本地安装的编解码器。为了了解在本地系统中安装的 fourcc 编解码器是否可用,推荐 http://mediaarea.net/en/MediaInfo 上对很多平台都可用的开源工具 MediaInfo。

  • VideoCapture&VideoCapture::operator>>(Mat&image):这个函数抓取、解码并返回下一帧。这个方法和布尔函数 VideoCapture::read(OutputArray image)等价。可以使用这个函数而不使用函数 VideoCapture::grab(),然后使用 VideoCapture::retrieve()。
  • VideoWriter&VideoWriter::operator<<(const Mat&image):这个函数写入下一帧。这个方法和布尔函数 VideoWriter::write(const Mat&image)等价。

    在本示例中,有一个读取/写入循环,可同时地获取并处理窗口事件。waitKey(1000/fps)函数调用负责执行这个任务。在这个示例中,1000/fps 表示返回外部循环之前等待的毫秒数。尽管不精确,但对于录制的视频仍能获取每秒帧数的一个近似度量。
  • void VideoCapture::release():这个函数释放视频文件或采集设备。尽管在本示例中没有必要显式地包含,但为了说明它的使用,示例中仍包含了这个函数。
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post