视频读写
在opencv中视频读写常用videoCapture类,用于读取视频文件和图像序列、相激捕获视频的类
头文件
#include<opencv2/videoio.h>
常用函数
//en(): 打开视频文件或摄像头。
bool open(int device = 0, int flags = CAP_ANY);
//检查视频捕获设备是否已打开。
bool isOpened() const;
//释放视频捕获设备
void release();
//从视频流中读取一帧图像:read将捕获的视频一帧一帧的传输进fm
bool read(Mat &image);
// 获取视频属性
double get(int propId) const;
double get(const String &propName) const;
propId常用参数:
- CV_CAP_PROP_FRAME_WIDTH:帧宽度
- CV_CAP_PROP_FRAME_HEIGHT:帧高度
- CV_CAP_PROP_FPS:帧率
- CV_CAP_PROP_POS_FRAMES:当前帧数
- CV_CAP_PROP_POS_MSEC:当前毫秒数
- CV_CAP_PROP_POS_AVI_RATIO:相对于视频文件总时间的位置(0-1之间的值)
- CV_CAP_PROP_FRAME_COUNT:帧总数
- CV_CAP_PROP_BRIGHTNESS:亮度
- CV_CAP_PROP_CONTRAST:对比度
- CV_CAP_PROP_SATURATION:饱和度
- CV_CAP_PROP_HUE:色调
- CV_CAP_PROP_GAIN:增益
- CV_CAP_PROP_EXPOSURE:曝光
- CV_CAP_PROP_AUTO_EXPOSURE:自动曝光
- CV_CAP_PROP_WHITE_BALANCE_BLUE_U:蓝色平衡
- CV_CAP_PROP_RECTIFICATION:图像校正
//设置视频属性
void set(int propId, double value);
void set(const String &propName, double value);
//获取视频捕获域,例如CV_CAP_V4W(用于Webcams)
int getCaptureDomain() const;
//获取视频编解码器的FourCC代码
int getFourCC() const;
//获取当前帧号
int getFrameNumber() const;
//获取视频的帧率
int getFPS() const;
//获取视频的尺寸
Size getVideoSize() const;
//获取当前帧的大小
Size getFrameSize() const;
代码示例1:读取视频文件
int main(int argc, cahar* argv[])
{
//读取视频文件
VideoCapture vcapture("888.mp4");
Mat mfram;
//方法1:
if(vcapture.isOpened())//判断视频是否读取成功
{
//直接从视频文件或从设备捕获中抓取帧
while(vcapture.grab())
{
vcapture >> mframe; //将视频中数据流向mframe
imshow("获取MP4视频文件",mframe);
}
}
//方法2:
while (true)
{
if (cap.read(frame))
{ // 读取下一帧
cv::imshow("Frame", frame);
cv::waitKey(1); // 等待键盘输入
} else {
std::cout << "到达视频末尾" << std::endl;
break;
}
}
代码示例2:选取摄像头设置,将图像保存到工程目录
VideoCapture vcapture;
mat mpic;
int ic = 0;
vcapture.open(0); //表示使用我们电脑自带的摄像头
if(!vcapture.isOpened()) //判断读取摄像头设备是否成功
{
return -1;
}
while(1)
{
vcapture >> mpic;
imshow("读取摄像头设备",mpic);
if(waitKey(20) == 32) //当用户按键:空格保存图片
{
string strname = to_string(ic) + "jpg"; //将照片以jpg格式保存
imwrite(strname,mpic); //将上面按空格键将图像逐帧保存下来
ic++;
}
}
将图片保存在特定文件夹下:
if(waitKey(20) == 32) //当用户按键:空格保存图片
{
string folder_path = "/path/to/folder/"; //指定保存图像的文件夹路径
string file_name = folder_path + to_string(ic) + ".jpg"; //将照片以jpg格式保存在指定文件夹中
imwrite(file_name, mpic); //将上面按空格键将图像逐帧保存下来
ic++;
}
QT中对视频帧的操作:将当前帧保存到控件中显示:
//打开摄像头
cap.open(0); //dev/video
//采集数据
Mat SrcImage;
if(cap.grab())
{
cap.read(SrcImage);//读取一帧数据
}
if(SrcImage.data == nullptr) return;
//将opencv里面的Mat数据(BGR)转换为Qt里面的QImage(RGB)
cvtColor(SrcImage,SrcImage,COLOR_BGR2RGB);
QImage image(SrcImage.data,SrcImage.cols,SrcImage.rows,SrcImage.step1(),QImage::Format_RGB888);
QPixmap mmp = QPixmap::fromImage(image);
ui->videoShow->setPixmap(mmp);
视频录制
cv::VideoWriter 是 OpenCV 中用于将视频帧写入视频文件的类。
常用函数:
1 .构造函数:
cv::VideoWriter::VideoWriter(const string& filename, //输出视频文件路径。
int fourcc, //帧率,表示每秒播放的帧数。
double fps, //视频帧的尺寸
Size frameSize, //视频帧的尺寸
bool isColor = true //指定是否为彩色视频,默认为 true
);
2. 打开 VideoWriter:
bool cv::VideoWriter::open(const string& filename,
int fourcc,
double fps,
Size frameSize,
bool isColor = true
);
该函数用于打开视频文件并设置参数,返回值为 true 表示成功打开。
3. 写入视频帧:
//写入视频帧
bool cv::VideoWriter::write(InputArray image);//要写入的视频帧,可以是 cv::Mat 或 cv::UMat 类型的图像
//检查 VideoWriter 是否已成功打开
bool cv::VideoWriter::isOpened() const;
//释放 VideoWriter 资源
void cv::VideoWriter::release();
在完成视频录制后,记得调用该函数释放资源。
代码示例:
int mian(int argc,char* argv[])
{
//读取源视频资源
VideoCapture vcap("test.mp4");
//读取源视频中帧的宽度和高度
int fvwidth = vcap.get(CAP_PROP_FRAME_WIDTH);
int fvheight = vcap.get(CAP_PROP_FRAME_HEIGHT);
//获取帧数
double fvfps = vcap.get(CAP_PROP_FPS);
//录取MP4视频
VideoWriter vw("e:/writemp4.mp4",vcap.get(CAP_PROP_FOURCC),fvfps,Size(fvwidth,fvheight),ture);
Mat fm;
while(true)
{
vcap.read(fm); //fm为输出,read将捕获的视频一帧一帧的传输进fm
//读取视频,判断是否为空
if(fm.empty())
{
break;
}
vw.write(fm);
imshow("测试:显示视图图像",fm);
}
vcap.release();
vw.release();
}