opencv 视频读取,属性查看,视频时长计算,资源释放

本章内容


     1. 打开视频
     2. 判断视频IO是否打开,打开失败的原因:1.视频不存在,2.视频IO被其他程序占用,3.没有读权限
     3. 获取视频属性
     4. 帧读取
     5. 判断帧是否读空,读到最后一帧,返回空
     6. 释放视频IO资源

 

1. 视频属性分析

opencv 视频读取,属性查看,视频时长计算,资源释放

输出结果:

opencv 视频读取,属性查看,视频时长计算,资源释放

2. 帧操作

opencv 视频读取,属性查看,视频时长计算,资源释放

输出结果

opencv 视频读取,属性查看,视频时长计算,资源释放

3. 读取最后一帧,释放资源

opencv 视频读取,属性查看,视频时长计算,资源释放

输出结果:

opencv 视频读取,属性查看,视频时长计算,资源释放

源码:

#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;
}