c/c++_渐变动画制作_合成视频

1、渐变动画制作原理:

两幅图像加权相加,img = a*img1 + (1-a)img2,效果从img1变到img2,取值从1到0,取值间隔可以随意,间隔越小,视觉上越自然。

2、代码 (c/c++_渐变动画制作_合成视频)

opencv版本是:3.4.5


#include <opencv2/opencv.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;

void gradient(cv::Mat& im1_src, cv::Mat& im2_src, VideoWriter writer, const char* save_pth_video)
{
cv::resize(im1_src, im1_src, cv::Size(im2_src.cols, im2_src.rows), 0, 0, cv::INTER_CUBIC);

cv::Mat im_src_blur1, im_src_blur2, im_src_blur3, im_src_blur4, im_src_blur5, im_src_blur6, im_src_blur7, im_src_blur8, im_src_blur9;
cv::Mat im_src_blur10, im_src_blur0;

im_src_blur0 = 1 * im1_src + 0 * im2_src;
im_src_blur1 = 0.9*im1_src + 0.1*im2_src;
im_src_blur2 = 0.8*im1_src + 0.2*im2_src;
im_src_blur3 = 0.7*im1_src + 0.3*im2_src;
im_src_blur4 = 0.6*im1_src + 0.4*im2_src;
im_src_blur5 = 0.5*im1_src + 0.5*im2_src;
im_src_blur6 = 0.4*im1_src + 0.6*im2_src;
im_src_blur7 = 0.3*im1_src + 0.7*im2_src;
im_src_blur8 = 0.2*im1_src + 0.8*im2_src;
im_src_blur9 = 0.1*im1_src + 0.9*im2_src;
im_src_blur10 = 0 * im1_src + 1 * im2_src;

cv::Size size = im_src_blur10.size();
writer.open(save_pth_video, CV_FOURCC(‘M‘, ‘J‘, ‘P‘, ‘G‘), 2, size, true);
writer.write(im_src_blur0);
writer.write(im_src_blur1);
writer.write(im_src_blur2);
writer.write(im_src_blur3);
writer.write(im_src_blur4);
writer.write(im_src_blur5);
writer.write(im_src_blur6);
writer.write(im_src_blur7);
writer.write(im_src_blur8);
writer.write(im_src_blur9);
writer.write(im_src_blur10);
}

int main() {
const char* save_pth_video = "a_result.avi";
const char* im1_pth = "./pic/1.png";
const char* im2_pth = "./pic/2.png";

cv::Mat im1_src = cv::imread(im1_pth);
cv::Mat im2_src = cv::imread(im2_pth);
VideoWriter writer;
gradient(im1_src, im2_src, writer, save_pth_video);

return 0;
}

直接运行,就可以查看效果。

我采用的图像为:

原文地址:https://www.cnblogs.com/wjjcjj/p/12191150.html

时间: 2024-11-12 17:17:53

c/c++_渐变动画制作_合成视频的相关文章

08第二种定时器_封装动画函数_轮播图_offset系列

前面复习: 下面会说第二种定时器. 第二种定时器: 第一种的定时器回顾: 另一个定时器 setTimeout() 它是一个一次性的定时器: 因为,代码是从上往下执行的,btn 还没有生成,所以getElementById("btn").onclick = 肯定是会报错的. 它是一次性的定时器,如果没有取消的话,它会一直占着空间,所以一般都要写按钮btn 去取消timeId  . 1 <!DOCTYPE> 2 <html lang="en">

ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Desktop的组成部分之一,ArcMap用于数据的浏览.编辑.显示.查询.地图排版等.ArcMap和ArcCatalog一起构成了完整的数据处理与管理分析的功能.在前一章中已经介绍了ArcCatalog的使用,本章中将介绍ArcMap的使用.本章的例子依然使用第4章里的小区平面图示例,但是将从原理的角度做更加

巧妙地制作背景色渐变动画

有的时候,嗯,应该说某些特定场合,我们可能需要下面这样的动画效果,渐变 + animation : 假设我们渐变的写法如下: div { background: linear-gradient(90deg, #ffc700 0%, #e91e1e 100%); } 按照常规想法,配合 animation ,我们首先会想到在 animation 的步骤中通过改变颜色实现颜色渐变动画,那么我们的 CSS 代码可能是: div { background: linear-gradient(90deg,

ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 GIS的六大功能是数据获取.存储.查询.分析.表达.输出.在前面的内容里已经介绍了使用ArcGIS进行数据获取.存储.查询.表达和输出的过程,本章将介绍如何在ArcGIS中进行地理分析.分析是GIS的核心和灵魂,是GIS区别于一般的信息系统.CAD或者电子地图系统的主要标志之一. GIS分析,就是研究

ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一个全面的了解,接下来在本章中,将通过一个案例来熟悉ArcGIS for Desktop的使用,从解决问题的过程中,逐渐适应ArcGIS桌面的界面和操作方式. 本章的练习数据是一个住宅小区的简单平面示意图,需要在已有的基础上把楼房的轮廓补充完整,并加以整饰,完成一幅地图. 1.1 打开地图文档并浏览

一种高斯模糊渐变动画的实现-b

关于高斯模糊的方式有很多种,但是如果需要模糊渐变,那么对这种高斯模糊算法的性能要求是比较高的,今天这里重点不讨论算法,只是提供一个动画实现的思路.动画效果如下: 高斯模糊渐变动画 //高斯模糊 -(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur {        if (blur < 0.f || blur > 1.f) {              blur = 0.5f;        }      

软件工程_东师站_第十周作业

一.PSP Data Type Job start Int End Total 20160510 助教 团队作业二 20:00 5 21:00 55 20160511 助教 团队作业二.三 18:45 16 20:45 104 20160512 耐撕 站立会议 18:15   18:35 20 二.进度条   代码行数 博客字数 知识点 第一周 400 430 见我博客软件工程——师大站1 第二周 0 5200 见我博客软件工程_东师站_课堂笔记 第三周 0 63 站立会议.单元测试 第四周 1

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat