QT版本:QT 6.3

OpenCV版本:opencv 4.6

编译环境:MSVC 2019 64bit

主要功能:通过OpenCV实现提取视频的单个视频帧图像或者全部视频帧图像,还可以获取视频的宽度、高度、帧率、帧数等,可自己添加。

opencv的配置我这里采用的MSVC的编译环境,可以直接导入外部库即可使用,部分步骤如下:

1. 右键项目,添加库,外部库

2. 选择库文件路径如下,选择包含路径如下

opencv方法实现类

opencv.h

#ifndef OPENCV_H
#define OPENCV_H#include <QObject>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
#include <QString>
#include <QImage>
#include <QList>using namespace cv;class opencv : public QObject
{Q_OBJECT
public:explicit opencv(QObject *parent = nullptr);void setVideoCapture(VideoCapture cap);VideoCapture getVideoCapture();bool openVideo(QString path);int getFrameNum();int getFrameRate();int getFrameWidth();int getFrameHeight();QImage getOneFrame(int posNum);QList<QImage> getAllFrame();QImage MatToQImage(const cv::Mat& mat);void test01();signals:private:VideoCapture m_cap;};#endif // OPENCV_H

opencv.cpp

#include "opencv.h"
#include <QDebug>opencv::opencv(QObject *parent): QObject{parent}
{/* template:QImage img;QList<QImage> imgList;openVideo("F:/videoTest.mp4");test01();// 获取指定帧数的单个视频帧img = getOneFrame(89);img.save("imgimg.png");// 获取全部视频帧imgList = getAllFrame();for(int i = 0; i < getFrameNum(); i++){imgList.at(i).save(QString("img%1.png").arg(i));}*/
}
// 设置VideoCapture
void opencv::setVideoCapture(VideoCapture cap)
{this->m_cap = cap;
}
// 获取VideoCapture
VideoCapture opencv::getVideoCapture()
{return this->m_cap;
}
// 打开视频
bool opencv::openVideo(QString path)
{this->m_cap.open(path.toStdString());if(!m_cap.isOpened()){qDebug() << "video open fail";return false;}return true;
}
// 获取总帧数
int opencv::getFrameNum()
{return this->m_cap.get(CAP_PROP_FRAME_COUNT);
}
// 获取帧率
int opencv::getFrameRate()
{return this->m_cap.get(CAP_PROP_FPS);
}
// 获取宽度
int opencv::getFrameWidth()
{return this->m_cap.get(CAP_PROP_FRAME_WIDTH);
}
// 获取高度
int opencv::getFrameHeight()
{return this->m_cap.get(CAP_PROP_FRAME_HEIGHT);
}
// 获取指定位置的视频帧
QImage opencv::getOneFrame(int posNum)
{QImage img;Mat frame;if(!this->m_cap.isOpened()){qDebug() << "video open fail";return img;}if(posNum >= getFrameNum()){qDebug() << "video frame position num overflow";return img;}this->m_cap.set(CAP_PROP_POS_FRAMES, posNum);if(!this->m_cap.grab()){qDebug() << "grab in opencv failed";return img;}this->m_cap >> frame;img = MatToQImage(frame);return img;
}
// 获取全部视频帧
QList<QImage> opencv::getAllFrame()
{QList<QImage> imgList;for(int i = 0; i < getFrameNum(); i++){imgList.insert(i, getOneFrame(i));}return imgList;
}
// Mat转图像
QImage opencv::MatToQImage(const cv::Mat& mat)
{// 8-bits unsigned, NO. OF CHANNELS = 1if (mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)image.setColorCount(256);for (int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}// Copy input Matuchar *pSrc = mat.data;for (int row = 0; row < mat.rows; row++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if (mat.type() == CV_8UC3){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if (mat.type() == CV_8UC4){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image.copy();}else{return QImage();}
}void opencv::test01()
{qDebug() << getFrameWidth() << getFrameHeight() << getFrameRate() << getFrameNum();
}

3. 编译后出现缺失文件提示,则将对应文件拷贝至编译文件内即可

项目资源免费下载地址:

qt6+opencv获取视频帧图像源码-QT文档类资源-CSDN下载

end 

qt6+opencv获取视频帧相关推荐

  1. OpenCV获取视频帧

    视频是一帧帧的图像,视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. OpenCV 中,VideoCapture 类和 VideoWriter ...

  2. Android FFmpeg移植总攻略——获取视频帧数(亲测可用)

    第一次尝试使用Android 移植FFmpeg算法,一路坎坷,最终做如下总结,适用于Android手机.Android开发板.亲测可用. 一.下载组件 在Android Studio中下载所需组件:C ...

  3. python获取视频帧的时间_Python提取视频中图片的示例(按帧、按秒)

    一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'D:\\test\\' ...

  4. RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP-Android解码获取视频帧的方法

    应用场景 EasyPlayer-RTSP在多年与VLC的对标过程中,积累了广泛的应用场景,EasyPlayer-RTSP底层与上层全部自主开发,自主知识产权,可实战测试. EasyPlayer-RTS ...

  5. opencv提取视频帧,将多张图片组合成视频(C++)

    OpenCV-视频处理-视频处理5191 2 opencv提取视频帧,将多张图片组合成视频(C++) 作者:bit452 参考:http://blog.sina.com.cn/s/blog_5f593 ...

  6. python用OpenCV读取视频帧数、高度宽度等

    python用OpenCV读取视频帧数.高度宽度等 import cv2 import time# 2655 def get_each_frame(video_path):# 读取视频文件videoC ...

  7. 获取视频帧图片,FFmpegMediaMetadataRetriever修改,优化,提高加载速度

    一.背景 因为工作需要制作视频预览功能,使用网上开源代码发现加载第一个视频时,比较耗时,差不多三秒左右,所以对其进行了部分修改,并重新编译使用新ffmpeg 4.1.3 https://github. ...

  8. 获取视频帧数和总帧数

    获取视频帧数和总帧数代码 import cv2 videoPath=input("请输入视屏文件的绝对路径:") # 将视频文件路径转化为标准的路径 videoPath=video ...

  9. Android快速获取视频帧

    2017年短视频应用如雨后春笋般先后上线,现在的短视频App大多支持本地视频的上传以及裁剪.下面讲一讲裁剪视频时预览视频图片的快速获取方法.当选择一个视频之后,底下通常有预览图片,这就是视频帧,比如快 ...

最新文章

  1. ESXi6.5环境搭建(五:常见问题及解决方案实验总结)
  2. 【Vegas原创】将treeview父结点的链接改为折叠事件
  3. 2011年12月份学习总结,在PE的前端标准思考和萌芽
  4. 阿里面试官:什么样的人能在阿里晋升?
  5. 2013\Province_Java_C\2.组素数
  6. Android 中的LayoutInflater的理解
  7. linux_ls命令详解
  8. Python之 while循环
  9. git创建仓库,并提交代码(第一次创建并提交)
  10. sonic——可替代Elasticsearch的简单搜索引擎
  11. vba 根据分辨率 缩放显示比例_GANTTER.VBA.初体验
  12. tomcat绕过同源策略(CORS)--亲测有效
  13. 俄罗斯方块java代码_java的俄罗斯方块代码
  14. 2015到3020计算机参考文献,2015版参考文献著录规则新变
  15. yalmip实用操作(1)
  16. 如何重置华为交换机初始密码?
  17. IC基础(三):跨时钟域处理——电平同步器
  18. 无法打开计算机桌面图标,桌面图标打不开如何修复?桌面图标无法打开的处理方法...
  19. 利用jsPDF把图片转成pdf格式保存本地指定目录
  20. 那些看过一次后,就令人心里一动的美好词汇

热门文章

  1. 五种免疫球蛋白:IgG、IgA、IgM、IgD和IgE
  2. nuxt解决首屏加载慢问题_天涯明月刀手游腾讯手游助手 PC端 卡加载,无法登陆问题 解决方案...
  3. 艾永亮:纯干货!企业的五条产品创新战略,看完涨知识了
  4. html中的电话号码
  5. iPad软件界面设计基本规范
  6. RAR文件点右键没有解压选项,怎么办?
  7. 昆仑通态MCGS嵌入式触控屏不能自动保存初值问题解决办法
  8. 医学影像数据的查看工具汇总
  9. urllib学习记录
  10. 爬虫手册02 Requests的使用