医工互联

 找回密码
 注册[Register]

手机动态码快速登录

手机号快速登录

微信登录

微信扫一扫,快速登录

QQ登录

只需一步,快速开始

查看: 157|回复: 0
收起左侧

案例分享:Qt内窥镜相机录像程序(打开摄像头、支持多种摄像头、分辨率调整

[复制链接]

  离线 

发表于 2022-11-20 10:20:13 来自手机 | 显示全部楼层 |阅读模式 <
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108489004
长期持续项目技术分享,Shang业Ding制Zi询博主,QQ:21497936 WX:yangsir198808
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
合作案例专栏:案例分享(体验Demo可下载,只定制)

OpenCV开发专栏(点击传送门)


需求

  嵌入式window ce设备上的内窥镜相机程序。
  打开摄像头,兼容多种摄像头,摄像头分辨率切换(摄像头管理)。
  对图像进行翻转、旋转、亮度调整(图像基本算法管理)
  对调整后的图像进行拍照、延时拍照。
  对调整后的图像进行录像(编码录制)。
  对照片和录像进行回看(图片浏览器、视频播放器)
  长时间运行稳定。

Demo

  
1.gif

  
2.gif

  
3.gif

  
4.gif

  
5.gif

  
6.gif

  
7.gif

体验下载地址

  CSDN:https://download.csdn.net/download/qq21497936/12827160
  QQ群:1047134658(点击“文件”搜索“camera”,群内与博文同步更新)

原理

  使用ffmpeg处理摄像头、使用OpenCV处理录像和播放;

v1.5.0功能



  • 打开摄像头,兼容多种摄像头,摄像头分辨率切换(摄像头管理)。
  • 对图像进行翻转、旋转、亮度调整(图像基本算法管理)
  • 对调整后的图像进行拍照、延时拍照。
  • 对调整后的图像进行录像(编码录制)。
  • 对照片和录像进行回看(图片浏览器、视频播放器)

Demo核心代码

FfmpegCameraManager.h:摄像头管理类
  1. #ifndef FFMPEGCAMERAMANAGER_H
  2. #define FFMPEGCAMERAMANAGER_H
  3. /************************************************************\
  4. * 控件名称: FfmpegCameraManager, ffmpeg管理类(用于摄像头操作)
  5. * 控件描述:
  6. *          1.打开摄像头
  7. *          2.支持动态切换分辨率
  8. * 作者:红模仿    联系方式:QQ21497936
  9. * 博客地址:https://blog.csdn.net/qq21497936
  10. *       日期                版本               描述
  11. *    2018年09年14日     v1.0.0         ffmpeg模块封装空类
  12. *    2020年09年05日     v1.1.0         ffmpeg打开摄像头,支持的动态分辨率切换
  13. *    2020年09年08日     v1.2.0         兼容各种摄像头,解决内存溢出bug,对最高帧率做了支持范围内的限制
  14. *                                     限制帧率一般为25fps(除非最大小于25fps或者最小大于25fps)
  15. \************************************************************/
  16. #include <QObject>
  17. #include <QString>
  18. #include <QDebug>
  19. #include <QTimer>
  20. #include <QThread>
  21. #include <QImage>
  22. #include <QProcess>
  23. #include <QMessageBox>
  24. #include <QDateTime>
  25. extern "C" {
  26.     #include "libavcodec/avcodec.h"
  27.     #include "libavformat/avformat.h"
  28.     #include "libswscale/swscale.h"
  29.     #include "libavdevice/avdevice.h"
  30.     #include "libavformat/version.h"
  31.     #include "libavutil/time.h"
  32.     #include "libavutil/mathematics.h"
  33.     #include "libavformat/avformat.h"
  34.     #include "libswscale/swscale.h"
  35.     #include "libswresample/swresample.h"
  36.     #include "errno.h"
  37.     #include "error.h"
  38. }
  39. #define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("hh:mm:ss:zzz")
  40. class FfmpegCameraManager : public QObject
  41. {
  42.     Q_OBJECT
  43. public:
  44. public:
  45.     explicit FfmpegCameraManager(QObject *parent = nullptr);
  46. signals:
  47.     void signal_captureOneFrame(QImage image);
  48. public:
  49.     static QString getAvcodecConfiguration();
  50. public:
  51.     bool init();
  52.     bool openUsbCamera();
  53.     QString getUsbCameraName();
  54.     QList<QString> getUsbCameraInfo();
  55.     int getCurrentFps();
  56.     int getCurrentSizeFpsIndex();
  57.     QList<QSize> getListSize() const;
  58. public slots:
  59.     void slot_start();
  60.     void slot_stop();
  61.     void slot_setSizeFps(int index);
  62. protected slots:
  63.     void slot_captureOneFrame();
  64. signals:
  65. public slots:
  66. private:
  67.     static bool _init;
  68.     AVFormatContext *_pAVFormatContext;         // 全局上下文
  69.     AVInputFormat *_pAVInputFormat;
  70.     AVDictionary* _pAVDictionary;               // 打开编码器的配置
  71.     AVCodecContext *_pAVCodecContextForAudio;   // 音频解码器上下文
  72.     AVCodecContext *_pAVCodecContextForVideo;   // 视频解码器上下文(不带音频)
  73.     AVCodec * _pAVCodecForAudio;                // 音频解码器
  74.     AVCodec * _pAVCodecForVideo;                // 视频解码器(不带音频)
  75.     int _streamIndexForAudio;                   // 音频流序号
  76.     int _streamIndexForVideo;                   // 视频流序号
  77.     SwrContext *_pSwrContextForAudio;           // 音频转换上下文
  78.     bool _running;
  79.     bool _first;
  80.     bool _opened;
  81.     uint8_t *_pOutBuffer;
  82.     AVFrame * _pFrame;
  83.     AVFrame * _pFrameRGB;
  84.     AVPacket *_pAVPacket;
  85.     SwsContext *_pSwsContext;
  86.     int _videoIndex;
  87.     QString _cameraDescription;
  88.     QList<QSize> _listSize;
  89.     QList<int> _listFps;
  90.     QList<QString> _listSizeFpsInfo;
  91.     int _currentSizeFpsIndex;
  92. };
  93. #endif // FfmpegCameraManager_H
复制代码
OpenCVManager.h:录像与播放视频类
  1. #ifndef OPENCVMANAGER_H
  2. #define OPENCVMANAGER_H
  3. /************************************************************\
  4. * 控件名称: OpenCVManager,OpenCV管理类
  5. * 控件描述:
  6. *          1.OpenCV操作支持
  7. *          2.支持录像(.avi格式)
  8. * 作者:红模仿    联系方式:QQ21497936
  9. * 博客地址:https://blog.csdn.net/qq21497936
  10. *       日期             版本               描述
  11. *   2019年11月09日      v1.0.0   opencv拍照和录像Demo
  12. *   2020年09月07日      v1.1.0   增加了单纯录像的接口
  13. \************************************************************/
  14. #include <QObject>
  15. #include <QImage>
  16. #include <QDateTime>
  17. #include <QTimer>
  18. // opencv
  19. #include "opencv/highgui.h"
  20. #include "opencv/cxcore.h"
  21. #include "opencv2/core/core.hpp"
  22. #include "opencv2/highgui/highgui.hpp"
  23. #include "opencv2/opencv.hpp"
  24. class OpenCVManager : public QObject
  25. {
  26.     Q_OBJECT
  27. public:
  28.     explicit OpenCVManager(QObject *parent = nullptr);
  29.     ~OpenCVManager();
  30. public:
  31.     QString getWindowTitle() const;
  32.     double getBrightness();
  33.     double getContrast() const;
  34.     double getSaturation() const;
  35.     double getHue() const;
  36.     double getGain() const;
  37.     bool getShowProperty() const;
  38.     double getExposure() const;
  39.     int getRotate() const;
  40.     bool getMirror() const;
  41. public:
  42.     void setBrightness(double value);
  43.     void setContrast(double value);
  44.     void setSaturation(double value);
  45.     void setHue(double value);
  46.     void setGain(double value);
  47.     void setShowProperty(bool value);
  48.     void setExposure(double value);
  49.     void setRotate(int rotate);
  50.     void setMirror(bool mirror);
  51. signals:
  52.     void signal_captureOneFrame(cv::Mat mat);   // 接收图像后抛出信号
  53. public:
  54.     bool startCapture(int usb, int width = 1280, int height = 720);
  55.                                         // 打开摄像头, 0...
  56.     bool startCapture(QString url, int width = 1280, int height = 720);
  57.                                         // 打开摄像头, 网络摄像头地址
  58.     bool stopCapture();                 // 关闭摄像头
  59.     void startRecord(QString filePath); // 开始录像(使用的是opencv打开的摄像头)
  60.     void stopRecord();                  // 停止录像(使用的是opencv打开的摄像头)
  61. public slots:
  62.     void slot_inputRecordImage(QImage image);
  63.     void slot_stopRecordFormOut();
  64. public:     // 单独的一块业务,使用的是开始录像后,从类外面输入QImage进行录像
  65.     void startRecordFromOut(QString filePath, int fps);
  66.     void inputRecordImage(QImage image);
  67.     void stopRecordFormOut();
  68. public slots:
  69.     bool start();                       // 开启线程
  70.     bool stop();                        // 关闭线程
  71. protected slots:
  72.     void slot_captrueFrame();           // 消息循环获取图像
  73.     void slot_stopCapture();            // 当正在采集中时(>>时),关闭摄像头会导致程序崩溃,所以采集与停止放一个线程中(消息循环)
  74. protected slots:
  75.     void slot_startRecord(QString filePath);        // 录像(使用的是opencv打开的摄像头)
  76.     void slot_stopRecord();                         // 停止录屏(使用的是opencv打开的摄像头)
  77. public:
  78.     static QImage cvMat2QImage(const cv::Mat &mat);
  79.     static cv::Mat image2Mat(QImage image);    // Qimage 转 cv::Mat
  80.     static QImage mat2Image(cv::Mat mat);      // cv::Mat 转 QImage
  81. private:
  82.     cv::VideoCapture *_pVideoCapture;   // 摄像头实例
  83.     cv::VideoWriter *_pVideoWrite;      // 录像实例
  84.     QString _recordFilePath;            // 录制文件路径
  85.     bool _running;                      // 线程是否运行
  86.     bool _showProperty;                 // 是否显示属性参数
  87.     double _brightness;                 // 亮度
  88.     double _contrast;                   // 对比度
  89.     double _saturation;                 // 饱和度
  90.     double _hue;                        // 色调
  91.     double _gain;                       // 增益
  92.     double _exposure;                   // 曝光度
  93.     int _width;                         // 宽度
  94.     int _height;                        // 高度
  95.     bool _recording;                    // 标志是否正在录像
  96.     bool _startRecording;
  97.     int _rotate;                        // 旋转度数
  98.     bool _mirror;                       // 是否翻转
  99.     int _fps;                           // 帧率
  100.     int _index;                         // 帧序号
  101. private:
  102.     cv::VideoWriter *_pVideoWriteForOut; // 录像实例(从外部输入图像,非从opencv打开摄像头)
  103.     QString _recordFilePathForOut;       // 录像文件路径(从外部输入图像,非从opencv打开摄像头)
  104. private:
  105.     QString _windowTitle;
  106. };
  107. #endif // OPENCVMANAGER_H
复制代码

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108489004

来源:https://blog.csdn.net/qq21497936/article/details/108489004
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!
您需要登录后才可以回帖 登录 | 注册[Register] 手机动态码快速登录 微信登录

本版积分规则

发布主题 快速回复 收藏帖子 返回列表 客服中心 搜索
简体中文 繁體中文 English 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

QQ|RSS订阅|小黑屋|处罚记录|手机版|联系我们|Archiver|医工互联 |粤ICP备2021178090号 |网站地图

GMT+8, 2024-12-23 12:59 , Processed in 0.267846 second(s), 69 queries .

Powered by Discuz!

Copyright © 2001-2023, Discuz! Team.

快速回复 返回顶部 返回列表