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 ...
随机推荐
- guava(二) Equivalence & Supplier
一.Equivalence 一种判定两个实例是否相等的策略 全路径: com.google.common.base 声明: @GwtCompatible public abstract class E ...
- springboot 获取到的inputStream为空的问题
springboot在接收http请求的时候读取的request的inputStream,造成我们想自己读取inputStream的时候发现inputStream已经无法读取了. 为了读取inputS ...
- idea gradle项目导入
然后要选择正确的gradle版本: 每个开源项目的gradle版本,这个很重要.因为每一个gradle版本都不同.
- 【java】javac命令在win10不可用,提示javac不是内部或外部命令,也不是可运行的程序【解决方法】
JDK安装成功,并且配置了环境变量,java命令正常可以使用,但是javac命令提示 不是内部或外部命令,也不是可运行的程序 解决方法: 产生这个问题的原因,是因为环境变量的配置中,Path中配置使用 ...
- pom文件语法无误却报红叉(Unknown error)的可能原因
本文链接:https://blog.csdn.net/Little_Stars/article/details/94553090可能原因及解决办法: >> 缓存问题,只要 “Maven - ...
- jquery-ajax请求.NET MVC 后台
在ajax的URL中写上"/你的控制器名/你方法名" 在后台控制器中对应有两个常用类型一个是ActionResult还有一个是JsonResult 在访问时需要在类型上加上publ ...
- 整理:C#常用字符串操作,常用数值类型转换
一.字符串操作 1. 字符串连接 //将指定的数组所有元素拼接为一个字符串 string[] arr = {"A","B","C"}; st ...
- H5页面基础元素
H5页面结构元素示例 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&quo ...
- Python【day 8】文件
一.文件操作 open(文件路径,mode='模式',encoding='utf-8')模式:r w a rb wb ab r+ w+ a+ r+b w+b a+b常用的:r w ab表示字节,处理费 ...
- django--JWT认证
目录 JWT认证 JWT简介 安装 djang-jwt开发 配置 手动签发jwt token 基于django_restframework-jwt的全局认证 全局启用 局部启用禁用:任何一个cbv类首 ...