把视频按帧保存为图片

读取视频,按帧保存为图片C++

思路

视频是由帧组成的,先读取视频,设置初始帧和结束帧,根据所需的帧数量,从视频对象中读取帧,然后写入指定目录

主要步骤代码

//视频对象capture读取文件
VideoCapture capture("/home/gzl/CLionProjects/detection_yolo/frame_read_demo/run.mp4");

//读取视频中帧,读取时是逐帧读取
Mat frame;
capture.read(frame);

//将读到的帧写入指定目录
String str="";
imwrite(str,frame);

完整代码



//
// Created by gzl on 20-6-9.
//

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(){
    //打开视频文件
    VideoCapture capture("/home/gzl/CLionProjects/detection_yolo/frame_read_demo/run.mp4");

    //判断文件是否打开
    if(!capture.isOpened())
        cout<<"文件不存在"<<endl;

    //获取视频帧的总数
    long totalFrameNumber =capture.get(CV_CAP_PROP_FRAME_COUNT);
    cout << "整个视频共" << totalFrameNumber << "帧" << endl;

    //设置开始帧
    long frameToStart =1;
    capture.set(CV_CAP_PROP_POS_FRAMES,frameToStart);

    //设置结束帧
    long frameToStop=100;
    if(frameToStart>frameToStop){
        cout << "结束帧小于开始帧,程序错误,即将退出!" << endl;
        return -1;
    } else{
        cout << "结束帧为:第" << frameToStop << "帧" << endl;
    }

    //获取帧率
    double rate=capture.get(CV_CAP_PROP_FPS);
    cout<<"帧率为:"<<rate<<endl;


    bool stop=false; //定义一个用来控制读取视频循环结束的变量
    Mat frame;//承载帧的图像
    double delay = 1000 / rate;//两帧间的间隔时间:


    long currentFrame = frameToStart;//currentFrame是在循环体中控制读取到指定的帧后循环结束的变量
    String str="/home/gzl/CLionProjects/detection_yolo/test_p/";
    //利用while循环读取帧
    while(!stop)
    {
        if(!capture.read(frame)){
            cout << "读取视频失败" << endl;
            return -1;
        }

        //每隔3次保存一帧
        if(currentFrame%3==0){
            stringstream str;
            str << "/home/gzl/CLionProjects/detection_yolo/test_p/run/" << currentFrame << ".png";//*图片存储位置*//*

            cout << str.str( ) << endl;
            imwrite( str.str( ), frame );
        }

        //waitKey(intdelay=0)当delay≤ 0时会永远等待;当delay>0时会等待delay毫秒
        //当时间结束前没有按键按下时,返回值为-1;否则返回按键
        int c = waitKey( 1 );
        //按下ESC或者到达指定的结束帧后退出读取视频
        if ( ( char )c == 27 || currentFrame > frameToStop )
        {
            stop = true;
        }
        //按下按键后会停留在当前帧,等待下一次按键
        if ( c >= 0 )
        {
            waitKey( 0 );
        }
        currentFrame++;
    }
    
    //关闭视频文件
    capture.release();
    waitKey(0);
    return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当使用FFmpeg进行视频保存时,可以使用%Y%m%d%H%M%S(年月日小时分钟秒)的时间戳作为名称来保存文件。这个时间戳是根据你的计算机系统的时间来自动生成的,并且可以在命令中通过使用-date命令来提供。 例如,如果你想要用当前的系统时间来保存一个视频,你可以使用以下命令: ffmpeg -i input.mp4 -codec copy %Y%m%d%H%M%S.mp4 这将保存一个名为20220123123456.mp4的视频文件,并使用与文件名相对应的时间戳命名。当你想要保存多个视频时,每一个视频文件都会根据保存的时间自动被命名,并且通过这种方式,你可以轻松地区分每一个视频文件的不同版本。 总之,FFmpeg可以通过使用时间戳来自动保存视频,并且这个时间戳是根据你的计算机系统时间自动生成的,这样可以方便地区分不同版本的视频。 ### 回答2: 在使用FFmpeg保存视频时,可以通过设置文件名的方式自动按日期为名称保存。具体操作为,在保存视频的命令中添加时间戳参数,如下所示: ffmpeg -i input.mp4 -c copy "$(date +"%Y%m%d%H%M%S").mp4" 其中,date +"%Y%m%d%H%M%S"表示获取当前时间的年月日时分秒,然后将其作为文件名,并添加.mp4后缀。这样,每次保存视频时都会自动创建一个带有当前时间命名的视频文件,防止新的视频文件覆盖之前的文件,方便查找和管理。 需要注意的是,如果在Windows环境下运行FFmpeg,需要将文件名中的冒号(:)替换为其他字符,因为冒号在Windows的文件名中是非法字符。 ### 回答3: FFmpeg可以通过使用一组命令行选项来将视频保存为特定的名称。通过使用日期为文件名,可以帮助用户轻松对保存视频进行管理和分类。一种实现的方法是可以使用shell脚本与FFmpeg结合,来自动获取当前日期,并将其作为文件名保存。以下是一个示例脚本: #!/bin/bash DATE=$(date +"%Y-%m-%d") INPUT_FILE="your_video_file.mp4" OUTPUT_FILE="$DATE.mp4" ffmpeg -i "$INPUT_FILE" -acodec copy -vcodec copy "$OUTPUT_FILE" 此脚本获取当前日期并将其存储在DATE变量中。然后,可以使用输入和输出文件名来调用FFmpeg,并使用-acodec和-vcodec选项进行音频和视频编解码。最终生成的文件名将为当天的日期。将所有这些组合在一起,运行此脚本将创建一个名为“2021-01-01.mp4”(假设当天是2021年1月1日)的新文件,其中包含您的视频。 通过使用这种自动化的方法,可以使文件命名和存储更加简单,从而更容易找到和管理您的视频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值