• Win10系统,OpenCV用C++调阅本地视频文件,调阅本地和网络摄像头


    1 前言

    前边2篇文章介绍了在WIN10系统上,分别用C++和Python调用OpenCV接口,加载和显示一张静态图片。本篇我们来看一下,用C++如何调用OpenCV接口,打开和播放本地视频文件,打开本地、网络摄像头并播放视频。

    序号

    视频来源

    视频格式/协议

    参数

    1

    本地视频文件

    MP4

    文件名称

    2

    笔记本摄像头

    摄像头序号

    3

    网络摄像头

    RTSP

    rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101

    下边我们用海康IP摄像机做测试,所以表格中的rtsp地址,是海康摄像机的URL格式,其它品牌(大华、宇视)与之类似。

    rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101

    rtsp:表示采用RTSP协议从摄像机取流

    admin:摄像机网页登录用户名

    123456:摄像机网页登录密码

    192.168.1.105:摄像机IP地址

    554:RTSP默认端口

    2 OpenCV接口说明

    在测试程序中,主要用到了OpenCV以下接口:

    VideoCapture视频捕捉类,从视频文件、图像序列或摄像机捕获视频。

    我们主要使用到成员函数open,下边是open函数的原型:

    1. /** @brief Opens a video file or a capturing device or an IP video stream for video capturing.
    2. @overload
    3. Parameters are same as the constructor VideoCapture(const String& filename, int apiPreference = CAP_ANY)
    4. @return `true` if the file has been successfully opened
    5. The method first calls VideoCapture::release to close the already opened file or camera.
    6. */
    7. CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);

    播放视频文件和网络摄像机用到这个open重载函数。

    1. /** @brief Opens a camera for video capturing
    2. @overload
    3. Parameters are same as the constructor VideoCapture(int index, int apiPreference = CAP_ANY)
    4. @return `true` if the camera has been successfully opened.
    5. The method first calls VideoCapture::release to close the already opened file or camera.
    6. */
    7. CV_WRAP virtual bool open(int index, int apiPreference = CAP_ANY);

    播放笔记本摄像头视频,用到这个open重载函数。

    3 创建测试项目

    创建测试项目、配置开发环境,具体可参考上篇文章,这里就不多说了

    Win10+OpenCV4.6.0之开发环境(VS2022)配置入门_chexlong的博客-CSDN博客

    这次测试项目名称play_video,VS2022种创建好的项目截图

    将下列代码编辑到play_video.cpp文件里

    1. #include <opencv2\opencv.hpp>
    2. #include <iostream>
    3. #include <string>
    4. using namespace cv;
    5. using namespace std;
    6. //打开视频文件或网络摄像头,并播放视频
    7. bool OpenAndPlayVideoFile(const std::string& filename)
    8. {
    9. cout << "将要播放视频文件,按下空格键结束播放" << endl;
    10. VideoCapture capture;
    11. bool result = capture.open(filename);
    12. //检查是否成功打开
    13. if (!capture.isOpened())
    14. {
    15. cout << "打开文件失败,名称:" << filename << endl;
    16. return result;
    17. }
    18. //打印视频参数:宽、高、每秒传输帧数
    19. cout << "width = " << capture.get(CAP_PROP_FRAME_WIDTH) << endl;
    20. cout << "height =" << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
    21. cout << "fps = " << capture.get(CAP_PROP_FPS) << endl;
    22. try
    23. {
    24. Mat frame;
    25. while (true)
    26. {
    27. capture >> frame; //读取视频帧
    28. imshow("视频文件", frame); //在名称为“视频文件”的窗口中显示视频
    29. if (32 == waitKey(1)) //按下空格键退出视频每帧的显示
    30. {
    31. cout << "按下空格键,退出播放" << endl;
    32. break;
    33. }
    34. }
    35. }
    36. catch (const std::exception& e)
    37. {
    38. cout << "exception:" << e.what() << endl;
    39. }
    40. capture.release();
    41. destroyWindow("视频文件");
    42. cout << "视频文件播放完成" << endl << endl;
    43. return result;
    44. }
    45. //打开本地摄像头,并播放视频
    46. bool OpenAndPlayLocalCamera(const int& index)
    47. {
    48. cout << "将要播放本地摄像头视频,按下空格键结束播放" << endl;
    49. VideoCapture capture;
    50. bool result = capture.open(index); //打开0号、或1号、或2号...摄像头
    51. //检查是否成功打开
    52. if (!capture.isOpened())
    53. {
    54. cout << "打开本地摄像头失败, 编号:" << index << endl;
    55. return result;
    56. }
    57. //打印视频参数:宽、高、每秒传输帧数
    58. cout << "width = " << capture.get(CAP_PROP_FRAME_WIDTH) << endl;
    59. cout << "height =" << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
    60. cout << "fps = " << capture.get(CAP_PROP_FPS) << endl;
    61. try
    62. {
    63. Mat frame;
    64. while (true)
    65. {
    66. capture >> frame; //读取视频帧
    67. imshow("本地摄像头", frame); //在名称为“本地摄像头”的窗口中显示视频
    68. if (32 == waitKey(1)) //按下空格键退出视频每帧的显示
    69. {
    70. cout << "按下空格键,退出播放" << endl;
    71. break;
    72. }
    73. }
    74. }
    75. catch (const std::exception& e)
    76. {
    77. cout << "exception:" << e.what() << endl;
    78. }
    79. capture.release();
    80. destroyWindow("本地摄像头");
    81. cout << "视频文件播放完成" << endl << endl;
    82. return result;
    83. }
    84. int main()
    85. {
    86. cout << "使用OpenCV播放视频测试" << endl;
    87. //打开本地文件播放
    88. OpenAndPlayVideoFile("opencv.mp4");
    89. //打开本地0号摄像头播放
    90. OpenAndPlayLocalCamera(0);
    91. //打开网络摄像头播放
    92. OpenAndPlayVideoFile("rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101");
    93. cout << "完成测试" << endl;
    94. system("pause");
    95. return 0;
    96. }

    程序中实现了下边2个播放函数

    1. //打开视频文件或网络摄像头,并播放视频
    2. bool OpenAndPlayVideoFile(const std::string& filename)
    3. //打开本地摄像头,并播放视频
    4. bool OpenAndPlayLocalCamera(const int& index)

    代码中的视频文件opencv.mp4,放置在测试项目工程当前目录,如截图

    VS中代码截图

    4 播放效果截图

    视频文件

    网络摄像头

    调试控制台输出

  • 相关阅读:
    java-net-php-python-jspm足球队信息管理系统计算机毕业设计程序
    一、配置环境
    本地k8s部署kubesphere及踩坑记录
    柯桥在职学历提升|专科本科之自考本科哪些专业不考数学
    ElasticSearch7.3学习(二十四)----相关度评分机制详解
    BIGEMAP打开多数据格式(AutoCAD shp kml excel、txt、dat)
    -骑士巡游-
    L1-101 别再来这么多猫娘了!(2024PTA天梯赛)
    【汇编】第一个汇编程序(学习笔记)
    记录一次SQL注入src挖掘过程
  • 原文地址:https://blog.csdn.net/chexlong/article/details/126644650