关键

1参数里的分辨率是图像本身的分辨率,而不是指定生成的视频分辨率。如果要修改分辨率,要么后期软件处理,要么读图的时候resize

2要正常退出,不要强制退出。

3生成的只能是avi格式。

#include <iostream>
#include <string>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/opencv.hpp" using namespace std;
using namespace cv;
void Video_To_Image(string filename);
void Image_To_Video();
int imagetovideo();
int main()
{
//string video_name = "test.avi";//注意,使用string时,若不用using namespace std,需要使用std::string
//Video_To_Image(video_name);
Image_To_Video();
//imagetovideo();
return 0;
} void Video_To_Image(string filename)
{
cout << "---------------Video_To_Image-----------------" << endl;
cv::VideoCapture capture(filename);
if (!capture.isOpened())
{
cout << "open video error";
}
/*CV_CAP_PROP_POS_MSEC – 视频的当前位置(毫秒)
CV_CAP_PROP_POS_FRAMES – 视频的当前位置(帧)
CV_CAP_PROP_FRAME_WIDTH – 视频流的宽度
CV_CAP_PROP_FRAME_HEIGHT – 视频流的高度
CV_CAP_PROP_FPS – 帧速率(帧 / 秒)*/
int frame_width = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH);
int frame_height = (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT);
float frame_fps = capture.get(CV_CAP_PROP_FPS);
int frame_number = capture.get(CV_CAP_PROP_FRAME_COUNT);//总帧数
cout << "frame_width is " << frame_width << endl;
cout << "frame_height is " << frame_height << endl;
cout << "frame_fps is " << frame_fps << endl; int num = 0;//统计帧数
cv::Mat img;
string img_name;
char image_name[20];
cv::namedWindow("MyVideo", CV_WINDOW_AUTOSIZE);
while (true)
{
cv::Mat frame;
//从视频中读取一个帧
bool bSuccess = capture.read(frame);
if (!bSuccess)
{
cout << "不能从视频文件读取帧" << endl;
break;
}
//在MyVideo窗口上显示当前帧
imshow("MyVideo", frame);
//保存的图片名
//sprintf(const_cast<char*>(img_name.data()), "%s%d%s", "image", ++num, ".jpg");//保存的图片名
sprintf(image_name, "%s%d%s", "image", ++num, ".jpg");//保存的图片名
img_name = image_name;
imwrite(img_name, frame);//保存保存一帧图片
if (cv::waitKey(30) == 27 || num == frame_number)
{
cout << "按下ESC键" << endl;
break;
}
}
capture.release();//这句话貌似不需要
} void Image_To_Video()
{
cout << "---------------Video_To_Image-----------------" << endl; string s_image_name;
cv::VideoWriter writer;
int isColor = 1;//不知道是干啥用的
int frame_fps = 25;
int frame_width = 1920; //必须是图像真实的分辨率,这不是指定生成视频的分辨率
int frame_height = 1080; string video_name = "out.avi";
//CV_FOURCC('M', 'J', 'P', 'G') CV_FOURCC('D', 'I', 'V', 'X')
writer = VideoWriter(video_name, CV_FOURCC('D', 'I', 'V', 'X'), frame_fps, Size(frame_width, frame_height), isColor);
cout << "frame_width is " << frame_width << endl;
cout << "frame_height is " << frame_height << endl;
cout << "frame_fps is " << frame_fps << endl;
cv::namedWindow("image to video", CV_WINDOW_AUTOSIZE);
int num = 50;//输入的图片总张数
int i = 1;
Mat img; if (!writer.isOpened())
{
cout << "Error : fail to open video writer\n" << endl;
return ;
} while (i <= num)
{
string path = "F:/dongdong/1学习资料/1论文/2发表/稠密轨迹跟踪/最新论文/代码/0数据/光流跟踪/result/test2/2GUI/1/";
s_image_name = path + std::to_string(i++) + ".jpg";
img = imread(s_image_name);//读入图片
if (!img.data)//判断图片调入是否成功
{
cout << "Could not load image file...\n" << endl; break;
}
//imshow();
//写入 writer << img; imshow("image to video", img);
waitKey(1); if (cv::waitKey(30) == 27 || i == num)
{
cout << "按下ESC键" << endl;
cvReleaseVideoWriter;
break;
}
}
cvReleaseVideoWriter;
}

  

OpenCV 学习笔记(13)图像转换成视频的更多相关文章

  1. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  2. OpenCV学习笔记(5)——颜色空间转换

    学习如歌对图像进行颜色空间转换,从BGR到灰度图,或者从BGR到HSV等 创建一个程序用来从一幅图像中获取某个特定颜色的物体 1.转换颜色空间 OpenCV中有超过150种进行颜色空间转化的方法,但是 ...

  3. OpenCV学习笔记(10)——图像梯度

    学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...

  4. opencv学习笔记(七)---图像金字塔

    图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...

  5. OpenCV学习笔记(13)——轮廓特征

    查找轮廓的不同特征,例如面积,周长,重心,边界等 1.矩 图像的矩可以帮助我们计算图像的质心,面积等. 函数cv2.momen()会将计算得到的矩以一个字典的形式返回, 我们的测试图像如下: 例程如下 ...

  6. OpenCV学习笔记(9)——形态学转换

    不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 形态学操作是根据图像形状进行的简单操作.一般情况下对二值化图像进行操作.需要的参数有两个,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操 ...

  7. OpenCV学习笔记(7)——图像阈值

    简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

  8. ros学习笔记 - 深度传感器转换成激光数据(hector_slam)

    前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...

  9. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

随机推荐

  1. for...in 、for...of 、forEach 的区别

    无论是for…in还是for…of语句都是迭代一些东西.它们之间的主要区别在于它们的迭代方式. 1.for…in 语句以原始插入顺序迭代对象的可枚举属性.2.for…of 语句遍历可迭代对象定义要迭代 ...

  2. vue组件component没效果

    如果实在不知道问题所在,你就看看你的component的命名是不是驼峰命名

  3. 【网络知识之三】HTTPS协议

    HTTPS是身披SSL外壳的HTTP.HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包.HTTPS使用的主要目的是提供对网站服务器的 ...

  4. useEffect传入第二个参数陷入死循环

    最近新项目刚上手,就用了react的hooks,之前也看过hooks的不少文章,只是还没实战实战. 业务场景1:需要在页面一开始时得到一个接口的返回值,取调用另一个接口. 我的思路是,先设置这个接口的 ...

  5. 解决Docker服务无法正常启动

    重新docker服务报错如下: systemctl restart docker.service Cannot connect to the Docker datemon at tcp://0.0.0 ...

  6. 使用spring jpa hibernate框架时报错:javax.validation.UnexpectedTypeException: HV000030

    错误信息: [#%&*^]20190521121942:497.!react:all.,RctJobExecutor-1#D9AA5167921A464CA9DDA14943545426%NA ...

  7. RookeyFrame2.0发布,UI重构

    RookeyFrame2.0在原来1.0的基础上进行了UI的重构,设计了扁平化的样式风格,看起来更清爽,更赏心阅目,由于之前工作比较忙升级比较慢,后续会投入比较多时间来更新维护,同时针对二次开发项目做 ...

  8. Newtonsoft.Json使用技巧

    本篇将为大家介绍Newtonsoft.Json的一些高级用法,可以修改很少的代码解决上述问题. 阅读目录 Newtonsoft.Json介绍 基本用法 高级用法 总结 回到顶部 Newtonsoft. ...

  9. C#反射_两合并更新实体

    #region 更新实体模型 /// <summary> /// 更新实体模型 /// </summary> /// <typeparam name="T&qu ...

  10. 【翻译】Tusdotnet中文文档(1)配置和用法

    TUSDOTNET Tusdotnet是tus协议的一个dotnet实现.tus协议是用来规范文件上传的整个过程,tus基于http协议,规定了一些上传过程中的头部(headers)和对上传过程的描述 ...