opencv 视频读取,属性查看,视频时长计算,资源释放
本章内容
1. 打开视频
2. 判断视频IO是否打开,打开失败的原因:1.视频不存在,2.视频IO被其他程序占用,3.没有读权限
3. 获取视频属性
4. 帧读取
5. 判断帧是否读空,读到最后一帧,返回空
6. 释放视频IO资源
1. 视频属性分析
输出结果:
2. 帧操作
输出结果
3. 读取最后一帧,释放资源
输出结果:
源码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>int main(int argc, char *argv[])
{
/* 本章内容
1. 打开视频
2. 判断视频IO是否打开,打开失败的原因:1.视频不存在,2.视频IO被其他程序占用,3.没有读权限
3. 获取视频属性
4. 帧读取
5. 判断帧是否读空,读到最后一帧,返回空
6. 释放视频IO资源
*/
cv::VideoCapture vCap;
cv::String fileName = "/home/wang/dev/Image/01.mp4";
int openRet = vCap.open(fileName);
if(!openRet){
std::cout << "视频打开失败" << std::endl;
return -1;
}
if(!vCap.isOpened()){
std::cout << "视频打开失败" << std::endl;
return -1;
}
// 3.获取视频帧属性
std::cout << "获取视频帧宽度:" << vCap.get(cv::CAP_PROP_FRAME_WIDTH)<< std::endl;
std::cout << "获取视频帧高度:" << vCap.get(cv::CAP_PROP_FRAME_HEIGHT)<< std::endl;
std::cout << "视频帧位置:" << vCap.get(cv::CAP_PROP_POS_FRAMES)<< std::endl;
std::cout << "视频播放比例0-1之间:" << vCap.get(cv::CAP_PROP_POS_AVI_RATIO)<< std::endl;
std::cout << "视频帧格式:" << vCap.get(cv::CAP_PROP_FORMAT)<< std::endl;std::cout << "获取视频帧总帧的数目:" << vCap.get(cv::CAP_PROP_FRAME_COUNT)<< std::endl;
std::cout << "获取视频帧率:" << vCap.get(cv::CAP_PROP_FPS)<< std::endl;
std::cout << "视频时长:" << vCap.get(cv::CAP_PROP_FRAME_COUNT)/vCap.get(cv::CAP_PROP_FPS)<<"s"<< std::endl;// 4.读取帧
cv::Mat frame;
vCap >> frame;
// 5. 顺序读取帧
while(vCap.read(frame)){
cv::imshow("顺序读取帧 frame",frame);
}
std::cout << "\n跳转前:" << std::endl;
std::cout << "视频帧位置:" << vCap.get(cv::CAP_PROP_POS_FRAMES)<< std::endl;
std::cout << "视频播放比例0-1之间:" << vCap.get(cv::CAP_PROP_POS_AVI_RATIO)<< std::endl;
std::cout << "视频帧格式:" << vCap.get(cv::CAP_PROP_FORMAT)<< std::endl;
// 6. 跳转读取
vCap.set(cv::CAP_PROP_POS_FRAMES, 20);
vCap.read(frame);
cv::imshow("frame",frame);
std::cout << "\n跳转后:" << std::endl;
std::cout << "视频帧位置:" << vCap.get(cv::CAP_PROP_POS_FRAMES)<< std::endl;
std::cout << "视频播放比例0-1之间:" << vCap.get(cv::CAP_PROP_POS_AVI_RATIO)<< std::endl;
std::cout << "视频帧格式:" << vCap.get(cv::CAP_PROP_FORMAT)<< std::endl;// 读取最后一帧
vCap.set(cv::CAP_PROP_POS_FRAMES, vCap.get(cv::CAP_PROP_FRAME_COUNT) - 1);
vCap >> frame;
vCap >> frame;
std::cout << "\n 最后一帧: " << frame << std::endl;
vCap.release();//释放IO资源
std::cout << "\n 视频打开状态: " << vCap.isOpened() << std::endl;
cv::waitKey(0);return 1;
}