请扮演一个精通opencv的高手,试写一个使用已有SDK的视频采集代码,并能存储采集的视频,还能够改变它的分辨率(使用visual studio)为什么存储的视频会倍速
时间: 2024-05-03 12:23:05 浏览: 53
很荣幸能够扮演一个精通opencv的高手,下面给出使用已有SDK的视频采集代码,并能存储采集的视频,还能够改变它的分辨率的示例代码:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 打开摄像头或者视频文件
VideoCapture cap(0);
// 检查是否成功打开
if (!cap.isOpened())
{
cout << "无法打开摄像头或者视频文件!" << endl;
return -1;
}
// 获取视频的宽度和高度
double width = cap.get(CAP_PROP_FRAME_WIDTH);
double height = cap.get(CAP_PROP_FRAME_HEIGHT);
cout << "原始视频分辨率:" << width << "x" << height << endl;
// 设置新的分辨率
double new_width = 640;
double new_height = 480;
cap.set(CAP_PROP_FRAME_WIDTH, new_width);
cap.set(CAP_PROP_FRAME_HEIGHT, new_height);
cout << "新的视频分辨率:" << new_width << "x" << new_height << endl;
// 创建视频编码器并设置参数
int fourcc = VideoWriter::fourcc('M', 'J', 'P', 'G');
double fps = 30;
Size size(new_width, new_height);
VideoWriter writer("output.avi", fourcc, fps, size, true);
// 检查是否成功创建
if (!writer.isOpened())
{
cout << "无法创建视频文件!" << endl;
return -1;
}
// 循环读取视频帧并存储
while (true)
{
Mat frame;
cap >> frame;
if (frame.empty())
break;
// 显示原始视频帧
imshow("原始视频", frame);
// 存储经过调整的视频帧
writer.write(frame);
// 按ESC键退出
if (waitKey(1) == 27)
break;
}
// 释放资源
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
```
上述代码使用VideoCapture打开摄像头或者视频文件,使用set方法改变视频的分辨率,使用VideoWriter创建视频编码器并存储经过调整的视频帧,按ESC键退出循环读取视频帧。
关于为什么存储的视频会倍速,可能是由于设置的帧率和实际帧率不一致导致的。可以尝试调整帧率参数,或者使用其他视频播放器播放存储的视频文件。
阅读全文