OpenCV 学习笔记(13)图像转换成视频
关键
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)图像转换成视频的更多相关文章
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- OpenCV学习笔记(5)——颜色空间转换
学习如歌对图像进行颜色空间转换,从BGR到灰度图,或者从BGR到HSV等 创建一个程序用来从一幅图像中获取某个特定颜色的物体 1.转换颜色空间 OpenCV中有超过150种进行颜色空间转化的方法,但是 ...
- OpenCV学习笔记(10)——图像梯度
学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...
- opencv学习笔记(七)---图像金字塔
图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...
- OpenCV学习笔记(13)——轮廓特征
查找轮廓的不同特征,例如面积,周长,重心,边界等 1.矩 图像的矩可以帮助我们计算图像的质心,面积等. 函数cv2.momen()会将计算得到的矩以一个字典的形式返回, 我们的测试图像如下: 例程如下 ...
- OpenCV学习笔记(9)——形态学转换
不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等 形态学操作是根据图像形状进行的简单操作.一般情况下对二值化图像进行操作.需要的参数有两个,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操 ...
- OpenCV学习笔记(7)——图像阈值
简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...
- ros学习笔记 - 深度传感器转换成激光数据(hector_slam)
前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...
- opencv学习笔记(六)---图像梯度
图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...
随机推荐
- 迁移历史sql数据
--select * into Trade2018 from Aozzo_ODS..Trade t1 --where t1.Created<'2019-01-01' --创建索引 --creat ...
- Centos7.5 安装Mysql5.7
#yum -y install wget #wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rp ...
- Spring Boot2.0以上版本EmbeddedServletContainerCustomizer被WebServerFactoryCustomizer替代
在Spring Boot2.0以上配置嵌入式Servlet容器时EmbeddedServletContainerCustomizer类不存在,经网络查询发现被WebServerFactoryCusto ...
- 简要介绍Active Learning(主动学习)思想框架,以及从IF(isolation forest)衍生出来的算法:FBIF(Feedback-Guided Anomaly Discovery)
1. 引言 本文所讨论的内容为笔者对外文文献的翻译,并加入了笔者自己的理解和总结,文中涉及到的原始外文论文和相关学习链接我会放在reference里,另外,推荐读者朋友购买 Stephen Boyd的 ...
- 【02】Jenkins:第一个项目
写在前面的话 通过上一节我们成功的搭建起来 Jenkins,那么接下来就是体验如何构建我们的第一个项目了.当然在这之前我们得专门针对 Java 环境就行简单的配置. 全局工具配置 其实这次配置的主要还 ...
- wget下载阿里云oss的文件报错403
问题 在实际工作中,我们为了方便,会将一些脚本储存在云端(阿里云OSS),这样方便我们使用和下载,但是在实际的使用过程中,我们会遇到一些问题. 示例链接:https://djxlsp.oss-cn-s ...
- WPF 精修篇 静态资源
原文:WPF 精修篇 静态资源 在WPF中 如果设置好了一个控件样式或者矩形样式 如果Copy出一个新的 那么样式也会双份 比如 下面的矩形 我定义好了一个 Copy 以后 就出现一个新的 但是改变样 ...
- halcon机器视觉工程开发思路
参考:halcon学习笔记——机器视觉工程应用的开发思路https://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html
- python 排序 选择排序
算法思想: 首先从序列中选择一个最值,将这个元素和序列的首地址上的元素交换,这样就完成了一个元素的排序,接下来,重复上述过程,不断的从剩下的序列中选取最值,然后添加到有序部分的末尾(注意,这种添加是通 ...
- SpringBoot嵌入式Tomcat的自动配置原理
在读本篇文章之前如果你读过这篇文章SpringBoot自动装配原理解析应该会更加轻松 准备工作 我们知道SpringBoot的自动装配的秘密在org.springframework.boot.auto ...