视频读写和录制

本文详细介绍了在OpenCV中使用videoCapture类读取视频文件和图像序列,以及如何通过VideoWriter类进行视频录制。包括了关键函数的使用、视频属性的获取和设置,以及实际的代码示例。
摘要由CSDN通过智能技术生成

视频读写

在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();
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值