openCV实现图片的时钟和中心圆形扩大效果

一、问题描述

 

使用任意方式实现图片的时钟和中心圆形扩大效果。

 

二、问题分析

    在视频的制作中能够看到很多图片切换效果。在本次实验中要求实现图片呈时钟状显示(即新图像顺时针擦除原图像),和中心圆形向外扩散的效果。由于没有要求实现方式,首先需要确定实验平台。处理图像的平台或工具主要有Visual Studio 的GDI(GDI+),图像处理开源库openCV,matlab等。这里选择openCV,进行像素级的处理。openCV中的矩阵,以先行后列的顺序进行储存,左上角为坐标原点,向下为y轴,向右为x轴。将两幅不同的图片存储到矩阵Mat类中,以不同的方式进行像素的替换。绘制时钟擦效果时,需要考虑四个象限角度的变化。绘制中心圆扩散效果时,需要考虑半径的变化。将每一帧的图片写入到视频中,生成图片切换的视频。

算法分析

中心圆放大效果

从画面中心开始,新图像以圆形向外扩大,在这个过程中可以将时间和半径联系起来,t=0时r=0,t_max=r_max,两者始终保持相等。

最大半径即为图像对角线长度的一半,即r_max= 。

首先结果矩阵result赋值为pic0。

对圆的外切正方形进行扫描,根据像素的x,y值计算点到圆心的距离,计算出r=。

If(r<t)

  Result[x][y]=pic1[x][y];

由于使用OpenCV,使用迭代器进行像素的赋值。

时钟擦效果

分别对四个象限进行绘制。由于函数库中的tan参数为弧度制,需要进行角度的转换。定义常量PI为3.14159265。

绘制第一象限时,y的范围是0到y_max/2,x的绘制范围是x_max/2到(y_max / 2 - y)*tan(t*(PI/180))。需要注意边界情况,圆可能扩展到图片范围之外,需要使用min函数限制,x不超过x_max。

绘制第二象限时,y的范围为y_max/2到y_max,x的范围为((y - y_max / 2) / tan(t*(PI / 180)) +x_max / 2)到x_max。由于tan值处于分母的位置,需要保证不为0,因此剔除t=0的情况,单独绘制x轴正半轴的像素。

第三象限, y =y_max/2~ y_max,x= (x_max / 2 -(y - y_max / 2)*tan(t*(PI / 180)))~x_max。

第四象限,同样需要单独绘制x轴的负半轴。

y = 0~ y_max/2-1,x = 0~ (x_max / 2 - (y_max / 2 - y) /tan(t*(PI / 180)))

对于部分由于小数取整产生的填充空缺,在前面绘制完毕后,进行像素的补充填充(分布在x轴附近)。

详细设计(从算法到程序)

1.     主模块设计

主函数中读取两张图片,分别为pic0,pic1。调用图片切换效果函数circleTransition(Mat,Mat)和clockTransition(Mat,Mat)。

2.     圆形中心方法效果circleTransition(Mat pic0,Mat pic1)

设置视频格式,包括压缩帧率和尺寸,此处直接设置为常数,如果需要根据图片设置宽高,也可以方便地读取图片尺寸从而进行设置。

doublefps=20;//视频压缩帧率

      CvSizesize=cvSize(440,440);//图片序列中每张图片的宽高

      CvVideoWriter*writer=cvCreateVideoWriter("CircleTransition.avi",CV_FOURCC('M','J','P','G'),fps,size,true);

 

      设置循环中需要用到的常量和变量:

intr_max=0,r=0;

      intx_max=0,y_max=0;

      intx=0,y=0;

      x_max=pic0.cols;

      y_max=pic0.rows;

      r_max=int(sqrt(pow(float(x_max/2),

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值