最近遇到一些售前提供的BUG,但是他们提供的是录像视频,因为处理显示速度比较快,因此很难找到出现问题的位置。需要反复播放,自己编写了一个视频分解成图片这样就可以一张图一张图的对比,方便查看。
开发环境
qt+openvc
sudo apt install libopencv-dev
源码说明
2.1 引用opencv动态库
.pro文件需要添加opencv的动态库
LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs
2.2 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;
}
2.3 源代码地址
https://gitcode.net/arv002/qt/-/tree/master/opencv/VideoDecomposition
三、扩展
3.1 VideoCapture 详解
cv::VideoCapture
是 OpenCV 中用于从视频文件、摄像头或图像序列中捕获帧的类。它提供了一种方便的方式来处理视频流和图像序列。
以下是一些关于 cv::VideoCapture
的主要方法和属性的详细说明:
构造函数
cpp
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
是要设置的值。
示例用法
cpp
#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;
}
上述代码演示了如何打开视频文件、获取视频属性、逐帧读取视频并显示。请根据实际需求调整。