• Win10系统C++调用OpenCV实现网络摄像头录像和抓拍图片


    1 前言

    前边文章介绍了在WIN10系统上,分别用C++和Python调用OpenCV接口,播放本地和网络摄像头视频。本篇我们来看一下,用C++如何调用OpenCV接口,打开网络摄像头的视频,对其进行录像,并抓拍图片。

    视频来源

    视频格式/协议

    参数

    网络摄像头

    RTSP

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

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

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

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

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

    123456:摄像机网页登录密码

    192.168.1.104:摄像机IP地址

    554:RTSP默认端口

    输出文件

    格式

    文件名称

    录像文件

    mp4

    output.mp4

    抓拍图片文件

    bmp

    picture_x.bmp

    2 关键接口说明

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

    录制视频

    VideoWriter写视频文件类,录制视频文件时使用。

    测试程序中,用到该类的重载构造函数,原型如下:

    1. CV_WRAP VideoWriter(const String& filename, int fourcc, double fps,
    2. Size frameSize, bool isColor = true);

    参数说明:

    filename:保存的录像文件路径及名字

    fourcc指定视频编码器,特别注意,在OpenCV3种,该参数调用方式如CV_FOURCC('M','P','4','2')。在OpenCV4中,该参数调用方式做了改变,具体见后边代码。要不然编译不过

    fps:保存的录像视频帧率

    frameSize录像文件视频分辨率大小,即视频画面的宽和高

    isColor表示录像用彩色画面还是黑白画面,默认ture,彩色画面

    抓拍图片

    函数原型:

    1. CV_EXPORTS_W bool imwrite( const String& filename, InputArray img,
    2. const std::vector<int>& params = std::vector<int>());

    参数说明:

    filename:保存的抓拍图片文件路径及名字

    img抓拍的视频帧,其类型为Mat

    params用来设置对应图片格式的参数,一般情况下这些图片格式都是经过压缩,这里就是设置这些压缩参数来控制图片的质量。该参数是一个vector类型,里面分别存入paramId_1, paramValue_1, paramId_2, paramValue_2, ... 也就是说存入一对属性值。如果不设置该参数的话,则程序会自动根据所保存的图像格式采用一个默认的参数。

    3 创建测试项目

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

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

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

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

    1. #include <opencv2\opencv.hpp>
    2. #include <iostream>
    3. #include <string>
    4. using namespace cv;
    5. using namespace std;
    6. //打开网络摄像头录像
    7. bool OpenCameraAndRecord(const std::string& url)
    8. {
    9. cout << "将要播放视频文件,按下空格键结束播放" << endl;
    10. VideoCapture capture;
    11. bool result = capture.open(url);
    12. //检查是否成功打开
    13. if (!capture.isOpened())
    14. {
    15. cout << "打开文摄像头失败,url:" << url << endl;
    16. return result;
    17. }
    18. //打印视频参数:宽、高、每秒传输帧数
    19. int videoWidth = capture.get(CAP_PROP_FRAME_WIDTH);
    20. int videoHeight = capture.get(CAP_PROP_FRAME_HEIGHT);
    21. int videoFps = capture.get(CAP_PROP_FPS);
    22. cout << "视频分辨率为:" << videoWidth << "x" << videoHeight << ",fps:" << videoFps << endl;
    23. //下边是OpenCV3中的调用方式,OpenCV4对第二个参数接口做了调整
    24. //VideoWriter vedio("./record/output.mp4", CV_FOURCC('M', 'J', 'P', 'G'), videoFps, Size(videoWidth, videoHeight));
    25. VideoWriter recorder("./record/output.mp4", CAP_OPENCV_MJPEG, videoFps, Size(videoWidth, videoHeight), true);
    26. try
    27. {
    28. Mat frame;
    29. char pictureName[256] = { 0 };
    30. int pictureIndex = 1;
    31. while (true)
    32. {
    33. capture >> frame; //读取视频帧
    34. if (true == frame.empty())
    35. {
    36. cout << "获取视频帧为空,退出播放" << endl;
    37. break;
    38. }
    39. //如果仅在后台录制视频,不实施播放,把imshow注释掉
    40. imshow("摄像机实时视频", frame); //在名称为“视频文件”的窗口中显示视频
    41. recorder << frame; //给录像文件写入视频帧
    42. int key = waitKey(1);
    43. if (32 == key) //按下空格键退出视频每帧的显示
    44. {
    45. snprintf(pictureName, sizeof(pictureName), "./picture/picture_%d.bmp", pictureIndex++);
    46. cv::imwrite(pictureName, frame);
    47. }
    48. else if (27 == key) //按下ESC键退出视频播放和录制
    49. {
    50. cout << "按下空格键,退出播放和录制" << endl;
    51. break;
    52. }
    53. else {}
    54. }
    55. }
    56. catch (const std::exception& e)
    57. {
    58. cout << "exception:" << e.what() << endl;
    59. }
    60. capture.release();
    61. recorder.release();
    62. //如果仅在后台录制视频,不实施播放,把destroyWindow注释掉
    63. destroyWindow("摄像机实时视频");
    64. cout << "视频录制完成" << endl << endl;
    65. return result;
    66. }
    67. int main()
    68. {
    69. cout << "使用OpenCV录制视频测试" << endl;
    70. //打开网络摄像头播放
    71. //如果要打开电脑本地视频文件进行录制,下边参数传入视频文件路径和名字即可
    72. OpenCameraAndRecord("rtsp://admin:123456@192.168.1.104:554/Streaming/Channels/101");
    73. cout << "完成测试" << endl;
    74. system("pause");
    75. }

     测试项目工程当前目录,新创建2个文件夹:recordpicture,分别用于保存录像文件和抓拍图片文件

    VS中代码截图

     4 效果截图

     录像文件

    使用VLC打开播放

    抓拍图片

    打开图片

     5 参考资料

     OpenCV图片拍照及视频录制方法_top_geek_001的博客-CSDN博客_opencv 拍照

  • 相关阅读:
    基于ssm的奥博羽毛球俱乐部管理系统-计算机毕业设计
    DBCO-氨基 DBCO-NH2,DBCO-PEG-氨基 DBCO-PEG-NH2/Amine
    js的promise的究竟是同步还是异步的问题和promise.all可以同时请求多个接口是错误的回答的原因
    新库上线 | CnOpenData房地产业工商注册企业基本信息数据
    【Vue】组件里面的data为什么必须是一个函数?vue的css作用域中scoped作用和原理分别是什么?组件的自定义事件触发条件是什么?组件之间传值
    冒泡排序 和 选择排序
    成都理工大学_Python程序设计_第4章
    软件设计模式总结
    好用的博客评论系统 Valine 使用及避坑指南
    搭建一个springboot项目的基本流程
  • 原文地址:https://blog.csdn.net/chexlong/article/details/126976443