利用Qt+opencv实现视频分解为图片
作者:N阶二进制
最近遇到一些售前提供的BUG,但是他们提供的是录像视频,因为处理显示速度比较快,因此很难找到出现问题的位置。需要反复播放,自己编写了一个视频分解成图片这样就可以一张图一张图的对比,方便查看。
开发环境
qt+openvc
sudo apt install libopencv-dev
源码说明
引用opencv动态库
.pro文件需要添加opencv的动态库
LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs
Qt代码
将视频分解成每一帧,然后将每一帧保存位图片。
void MainWindow::slotClickBtn() { // 打开视频文件 cv::VideoCapture video("/pan/录屏_选择区域_20231227104611.mp4"); // 检查视频是否成功打开 if (!video.isOpened()) { std::cerr << "无法打开视频文件" << std::endl; } // 读取视频的帧率和总帧数 double fps = video.get(cv::CAP_PROP_FPS); int totalFrames = video.get(cv::CAP_PROP_FRAME_COUNT); // 逐帧读取视频并保存为图像文件 for (int frameNumber = 0; frameNumber < totalFrames; ++frameNumber) { cv::Mat frame; video.read(frame); // 检查是否成功读取帧 if (frame.empty()) { std::cerr << "无法读取视频帧" << std::endl; break; } // 生成图像文件名,例如 frame_0001.jpg std::string filename = "frame_" + std::to_string(frameNumber + 1) + ".jpg"; // 保存帧为图像文件 cv::imwrite(filename, frame); } // 关闭视频文件 video.release(); std::cout << "视频分解完成,共生成 " << totalFrames << " 张图像文件。" << std::endl; }
源代码地址
https://gitcode.net/arv002/qt/-/tree/master/opencv/VideoDecomposition
扩展
VideoCapture 详解
cv::VideoCapture
是 OpenCV 中用于从视频文件、摄像头或图像序列中捕获帧的类。它提供了一种方便的方式来处理视频流和图像序列。
以下是一些关于 cv::VideoCapture
的主要方法和属性的详细说明:
构造函数
cv::VideoCapture(const cv::String& filename); cv::VideoCapture(int index);
filename
:视频文件的路径,可以是本地文件路径或网络 URL。
index
:摄像头的索引。通常,0 表示默认摄像头,1 表示第二个摄像头,以此类推。
成员函数
bool open(const cv::String& filename);
打开视频文件。返回 true
表示成功打开,false
表示失败。
bool isOpened() const;
检查视频是否成功打开。返回 true
表示成功打开,false
表示失败。
void release();
释放资源。关闭视频文件或释放摄像头。
bool read(cv::OutputArray image);
从视频流中读取一帧。返回 true
表示成功读取,false
表示读取失败或到达视频末尾。
double get(int propId) const;
获取视频流的属性值,例如帧率、宽度、高度等。propId
是属性标识符,例如 cv::CAP_PROP_FPS
表示帧率。
bool set(int propId, double value);
设置视频流的属性值。propId
是属性标识符,value
是要设置的值。
示例用法
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::VideoCapture cap("path/to/your/video.mp4"); if (!cap.isOpened()) { std::cerr << "无法打开视频文件" << std::endl; return -1; } double fps = cap.get(cv::CAP_PROP_FPS); int width = cap.get(cv::CAP_PROP_FRAME_WIDTH); int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); std::cout << "帧率: " << fps << ",宽度: " << width << ",高度: " << height << std::endl; cv::Mat frame; while (cap.read(frame)) { // 处理每一帧 cv::imshow("Frame", frame); cv::waitKey(30); // 等待30毫秒 } cap.release(); cv::destroyAllWindows(); return 0; }
上述代码演示了如何打开视频文件、获取视频属性、逐帧读取视频并显示。请根据实际需求调整。
到此这篇关于利用Qt+opencv实现视频分解为图片的文章就介绍到这了,更多相关Qt opencv视频分解为图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!