网上找了一些例程,大多数是在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。就可以运行啦