赞
踩
初学者使用opencv对视频进行处理时,应该首先关注两个类:VideoCapture类和VideoWriter类
A.获取视频的属性:
double dRes = vidObj.get(propId);
B.设置视频的属性:
int propId = 4;
double dValue =100;
vidObj.set(propId, dValue);
获取视频文件或摄像头视频
视频播放函数如下(可直接使用):
/*@author @还下着雨ZG * @brief 播放指定的视频文件 * @param[in] strVideo, 视频文件所在路径 * @return int, 正表示播放成功,负数表示播放视频文件失败 */ int VideoPlay(const std::string& strVideo) { //创建VideoCapture对象 cv::VideoCapture capture; //打开视频文件 capture.open(strVideo); //判断是否打开成功 if (!capture.isOpened()) { std::cerr << "Failed to open video!" << std::endl; return -1; } //获取视频的帧率FPS double rate = capture.get(cv::CAP_PROP_FPS); //播放视频 cv::Mat frame; while (1) { capture >> frame; if (frame.empty()) { std::cout<<"播放完毕!"<<std::endl; break; } cv::imshow("Playing video...", frame); cv::waitKey(rate); } }
视频播放和暂停函数如下(可直接使用):
/*@author @还下着雨ZG * @brief 播放指定的视频文件并实现了暂停和继续 * @param[in] strVideo, 视频文件所在路径 * @return int, 正表示播放成功,负数表示播放视频文件失败 */ int VideoPlayAndStop(const std::string& strVideo) { //读取视频文件 cv::VideoCapture capture(strVideo, cv::CAP_ANY); if (!capture.isOpened()) { std::cerr << "Failed to open video file!" << std::endl; return -1; } //显示每一帧(视频自带帧率) cv::Mat imFrame; double dRate = capture.get(cv::CAP_PROP_FPS); int iDelay = 1000 / dRate; bool bStop = false; while (!bStop) { capture >> imFrame; if (imFrame.empty()) { bStop = true; return 0; } else { imshow("MyFrame", imFrame); } int iKeyInput = cv::waitKey(iDelay); if (char(iKeyInput) == 27 ) { bStop = true; } if (iKeyInput >= 0) { cv::waitKey(0); } } capture.release(); return 1; }
保存修改后的视频文件、保存摄像头获取的视频序列、对待保存的视频格式进行设置等
视频保存,该函数一般是用于对视频文件编辑之后的视频进行保存,或保存摄像头获取的视频序列(可根据实际需求做少量更改后使用):
int VideoSave(const std::string& strVideoSrc, const std::string& strVideoDst) { //获取视频 cv::VideoCapture capture; capture.open(strVideoSrc, cv::CAP_ANY); if (!capture.isOpened()) { std::cerr << "Failed to open video file!" << std::endl; return -1; } //创建视频录制对象 cv::VideoWriter writer; int iFourcc = writer.fourcc('M','J','P','G'); //视频编码格式 double dFps = 25.0; cv::Mat imFrame; capture >> imFrame; if(imFrame.empty()) return -2; cv::Size SzFrame = imFrame.size(); bool bIsColor = true; //彩色视频(false表示灰色视频) writer.open(strVideoDst,iFourcc, dFps, SzFrame, bIsColor); writer.write(imFrame);//将第一帧写入到writer对象中 int iRate = 1000/capture.get(cv::CAP_PROP_FPS); //获取原始视频的帧率 //遍历每一帧图像 while(1) { if(!capture.read(imFrame)) break; writer.write(imFrame); cv::imshow("Frame", imFrame); if(cv::waitKey(iRate)>=0) break; } writer.release(); capture.release(); return 1; }
注意:如果是需要保存摄像头的视频序列,应将该函数的第一个参数转换为摄像头的索引(0,1, …),函数内部做一定的修改即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。