Ubuntu16.04中使用OpenCV将视频转换成图片制作自己的EUROC数据集

网上找了一些例程,大多数是在Windows平台上做的,这里给的代码是基于Ubuntu16.04。

基于CMake工程,OpenCV 3.3.1

main.cpp如下

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <iostream>  
   
using namespace std;  
using namespace cv;  
   
int main()  
{  
    //打开视频文件:其实就是建立一个VideoCapture结构  写自己的路径
    VideoCapture capture("/home/lee/projects/Date_Make/build/1.mp4");  
    //检测是否正常打开:成功打开时,isOpened返回ture  
    if (!capture.isOpened())  
        cout << "fail toopen!"<< endl;  
   
    //获取整个帧数  
    long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);  
    cout << "整个视频共" << totalFrameNumber << "帧" << endl;  
   
    //设置开始帧()  
    long frameToStart = 1;  
    capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);  
    cout << "从第" <<frameToStart << "帧开始读" << endl;  

    //设置结束帧  
    int frameToStop = totalFrameNumber;  
    if (frameToStop < frameToStart)  
    {  
        cout << "结束帧小于开始帧,程序错误,即将退出!" << endl;  
        return -1;  
    }  
    else  
    {  
        cout << "结束帧为:第" << frameToStop << "帧" << endl;  
    }  
   
    //获取帧率  
    double rate = capture.get(CV_CAP_PROP_FPS);  
    cout << "帧率为:" << rate<< endl;  
    //定义一个用来控制读取视频循环结束的变量  
    bool stop = false;  
    //承载每一帧的图像  
    Mat frame;  
    //两帧间的间隔时间:  
    //int delay = 1000/rate;  
    double delay = 1000 / rate;  
    //利用while循环读取帧  
    //currentFrame是在循环体中控制读取到指定的帧后循环结束的变量  
    long currentFrame = frameToStart;  

    while (!stop)  
    {  
        //读取下一帧  
        if(!capture.read(frame))  
        {  
            cout << "读取视频失败" << endl;  
            return -1;  
        }  
        cout << "正在写第" << currentFrame << "帧" << endl;  
        stringstream str;  
        str<<"/home/lee/projects/Date_Make/image//" <<currentFrame << ".png"; //这里最后一位是 / 就直接生成图像序号名称 如果是 image/kl/ 生成的就是kl+图像序号
        cout << str.str() << endl;  
        imwrite(str.str() , frame);  
   
        if (currentFrame > frameToStop)  
        {  
            stop = true;  
        }  
        currentFrame++;
    }  
    //关闭视频文件  
    capture.release();  
    waitKey(0);  
    return 0;  
}  

CMakeLists.txt 如下

cmake_minimum_required( VERSION 2.8 )
project( Date_make )

set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

# opencv 
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

# eigen 
#include_directories( "/usr/include/eigen3/" )

# pcl 
#find_package( PCL REQUIRED COMPONENT common io )
#include_directories( ${PCL_INCLUDE_DIRS} )
#add_definitions( ${PCL_DEFINITIONS} )

add_executable( Date_make main.cpp )
target_link_libraries( Date_make ${OpenCV_LIBS} )

直接编译运行,最后的结果如下所示:

然后再文件夹里再写一个data.csv文件 我们的文件名序号就是时间戳 timestamp。就可以运行啦

猜你喜欢

转载自blog.csdn.net/qq_36122936/article/details/89002782