C++ 图像 和 视频 转换

C++

一.视频转图像 (保存每一帧)   

可参考:https://www.cnblogs.com/miaojinmin799/p/6845462.html

  #include<opencv2/highgui/highgui.hpp>
  #include<iostream>
  using namespace std;
  using namespace cv;
  int main(){
      VideoCapture cap("D:/1.wmv");  //读入视频
      Mat img;   //图像变量
      char image[20];  //保存路径
      int i = 0;   //图像计数
     while (cap.read(img))    //读取视频帧
     {
         sprintf(image, "%s%d%s", "..\\image", i++, ".jpg");   //指定保存路径
         imwrite(image, img);  //保存图像
     }
 }

结果展示:


二。图片 转 视频  (该方法,生成视频会卡)

1. 首先将本地图像的路径保存成  .txt文件

参考我的博客:https://blog.csdn.net/wgf5845201314/article/details/78404756?locationNum=9&fps=1

2. 利用 .txt 生成视频

//#include "stdafx.h"  
#include <iostream>  
#include <opencv2/core/core.hpp>  
#include <opencv2\highgui\highgui.hpp>  
#include <string>  
#include <fstream>  

using namespace std;

int main()
{
	cout << "*********************开始图像转换为视频*********************" << endl;
	string imagepath("C:\\Users\\jingling\\Desktop\\TCP图像传输_C++\\client\\clent\\list.txt");
	int m = imagepath.find_last_of('.');
	string avipath = imagepath.substr(0, m) + ".avi";
	ifstream File;
	File.open(imagepath);
	if (!File.is_open())
	{
		cout << "图像无法读取,请检查图像路径是否有误!" << endl;
		return -1;
	}
	string imageName;
	int height;
	int width;
	double rate;
	cout << "请输入帧率:";
	cin >> rate;
	cout << "请输入图像的宽度:";
	cin >> width;
	cout << "请输入图像的高度:";
	cin >> height;
	cout << "请输入图像是否为彩色,是输入1,不是则输入0!  ";
	int e;
	bool color = true;
	cin >> e;
	if (e == 0)
	{
		color = false;
	}
	cv::VideoWriter writer;
	writer.open(avipath, CV_FOURCC('M', 'J', 'P', 'G'), rate, cv::Size(width, height), color);
	if (!writer.isOpened())
	{
		cout << "Could not open the writer for write!" << endl;
		return -1;
	}
	while (getline(File, imageName))
	{
		cv::Mat image = cv::imread(imageName);
		if (!image.data)
		{
			cout << "Could not load image file..." << endl;
			return -1;
		}
		writer << image;
	}
	cout << "*********************生成视频成功!*********************" << endl;
	system("pause");
	return 0;
}

MATLAB

视频转图片

%%将视频转换成帧图片
clc;
clear;
%% 读取视频
video_path='video_test.avi';    
video_obj=VideoReader(video_path);   

frame_number=video_obj.NumberOfFrames;

%% 存储每一帧图片到文件夹image
if ~exist('image','dir')
    mkdir('image');
    disp('successfully create directory image!');
end

for i=1:frame_number
    image_name=strcat('./image/im_',num2str(i),'.jpg');   
    frame=read(video_obj,i);           
    imwrite(frame,image_name,'jpg');
end

disp('all images are written into directory image')

图片转视频  (完美,不卡)

framesPath = 'C:\Users\jingling\Desktop\TCP图像传输_C++\client\clent\';%图像序列所在路径,同时要保证图像大小相同  
videoName = 'C:\Users\jingling\Desktop\TCP图像传输_C++\client\clent\Bolt.avi';%表示将要创建的视频文件的名字  
fps = 25; %帧率  
startFrame = 0; %从哪一帧开始  
endFrame = 507; %哪一帧结束  
  
if(exist('videoName','file'))  
    delete videoName.avi  
end  
  
%生成视频的参数设定  
aviobj=VideoWriter(videoName);  %创建一个avi视频文件对象,开始时其为空  
aviobj.FrameRate=fps;  
  
open(aviobj);%Open file for writing video data  
%读入图片  
for i=startFrame:endFrame  
    fileName=sprintf('image%d',i);    %根据文件名而定 我这里文件名是image0.jpg image1.jpg ....  image507
    frames=imread([framesPath,fileName,'.jpg']);  
    writeVideo(aviobj,frames);  
end  
close(aviobj);% 关闭创建视频  

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值