织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 音视频技术 > 视频处理 >

N种图像切换特效

jackyhwei 发布于 2011-11-07 13:33 点击:次 
N种视频背景图像切换特效,类似于PPT上幻灯片切换的效果,现在有50种。编译需要opencv的支持。每次需要换图片时,先随机确定需要哪种特效,在接下来的30帧内切换完成。
TAG:

N种视频背景图像切换特效,类似于PPT上幻灯片切换的效果,现在有50种。编译需要opencv的支持。每次需要换图片时,先随机确定需要哪种特效,在接下来的30帧内切换完成。

BOOL ChangeBackGround(const IplImage *src1,const IplImage *src2, IplImage *dest,int model, int FrameNum)//每次切换用30帧时间
{
    if (FrameNum==30)
    {
        cvCopy(src2,dest);
        return TRUE;
    }
    if (model<10)
    {
        ChangeBackWithMask(src1,src2, dest, model, FrameNum);//掩模变大/变小效果2*5种
    }
    else if(model<26)
    {
        ChangeBackWithFly(src1,src2, dest, model, FrameNum);//飞入/飞出效果2*8种
    }
    else if(model<30)
    {
        ChangeBackWithExtrusion(src1,src2, dest, model, FrameNum);//挤压效果4种
    }
    else if(model<31)
    {
        ChangeBackWithEvolution(src1,src2, dest, model, FrameNum);//淡入淡出效果1种
    }
    else if (model<51)
    {
        ChangeBackWithMaskRotation(src1,src2, dest, model, FrameNum);//掩模旋转变大/变小效果4*5种
    }
    return TRUE;
}
BOOL ChangeBackWithMaskRotation(const IplImage *src1,const IplImage *src2, IplImage *dest,int model, int FrameNum)
{
    //Mask旋转变大/变小效果
    IplImage *mask=0;
    IplImage *destMask=0;
    IplImage *destMaskInverse=cvCreateImage(cvSize(320,240),8,3);
    IplImage *tempsrc1=cvCreateImage(cvSize(320,240),8,3);
    IplImage *tempsrc2=cvCreateImage(cvSize(320,240),8,3);
    int maskWidth, maskHeight,angle;
    if (model>=31&&model<=34)
    {
        mask=cvLoadImage("mask1.png");
    }
    else if (model>=35&&model<=38)
    {
        mask=cvLoadImage("mask2.png");
    }
    else if (model>=39&&model<=42)
    {
        mask=cvLoadImage("mask3.png");
    }
    else if (model>=43&&model<=46)
    {
        mask=cvLoadImage("mask4.png");
    }
    else if (model>=47&&model<=50)
    {
        mask=cvLoadImage("mask5.png");
    }
    destMask=cvCloneImage (mask);
    if(model%4<2)
    {
        angle=3*FrameNum;
    }
    else
    {
        angle=360-3*FrameNum;
    }
   
    double factor;
    float m[6];
    CvMat M = cvMat (2, 3, CV_32F, m);
    int width = src1->width;
    int height = src1->height;
    //factor=(float)(30-FrameNum)*(30-FrameNum)/900*6;
    //factor=(float)(30-FrameNum)/30*5;
    if(model%2==0)
    {
        factor=pow(1.06,30-FrameNum)-0.65;//用于控制变大变小的速度。
    }
    else
    {
        factor=pow(1.06,FrameNum)-0.65;//用于控制变大变小的速度。
    }
    //printf("%f ",factor);
    m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.));
    m[1] = (float) (factor * sin (-angle * 2 * CV_PI / 180.));
    m[3] = -m[1];
    m[4] = m[0];
    // 将旋转中心移至图像中间
    m[2] = width * 0.5f;
    m[5] = height * 0.5f;
    cvZero (destMask);
    cvGetQuadrangleSubPix (mask, destMask, &M);
    cvNot(destMask,destMaskInverse);
    if(model%2==0)
    {
        cvAnd(src1,destMaskInverse,tempsrc1);
        cvAnd(src2,destMask,tempsrc2);
    }
    else
    {
        cvAnd(src1,destMask,tempsrc1);
        cvAnd(src2,destMaskInverse,tempsrc2);
    }
    cvAdd(tempsrc1,tempsrc2,dest);
    cvReleaseImage(&tempsrc1);
    cvReleaseImage(&tempsrc2);
    cvReleaseImage(&mask);
    cvReleaseImage(&destMask);
    cvReleaseImage(&destMaskInverse);
    return TRUE;
}
BOOL ChangeBackWithEvolution(const IplImage *src1,const IplImage *src2, IplImage *dest,int model, int FrameNum)
{
    //淡入淡出效果
    float alpha=(float)FrameNum/30;
    cvAddWeighted(src1,1-alpha,src2,alpha,0,dest);
    return TRUE;
}
BOOL ChangeBackWithExtrusion(const IplImage *src1,const IplImage *src2, IplImage *dest,int model, int FrameNum)
{
    //挤压效果
    int width=320*FrameNum/30;
    int height=240*FrameNum/30;
    IplImage *tempsrc1=cvCreateImage(cvSize(320, 240), 8, 3);
    IplImage *tempsrc2=cvCreateImage(cvSize(320, 240), 8, 3);
    cvSetZero(tempsrc1);
    cvSetZero(tempsrc2);
//    cvCopy(src1,tempsrc1);
//    cvCopy(src2,tempsrc2);
    switch (model)
    {
    case 26:
        cvSetImageROI(tempsrc1,cvRect(0,0,320-width,240));
        cvSetImageROI(tempsrc2,cvRect(320-width,0,width,240));
        cvResize(src1,tempsrc1);
        cvResize(src2,tempsrc2);
        cvResetImageROI(tempsrc1);
        cvResetImageROI(tempsrc2);
        cvAdd(tempsrc1,tempsrc2,dest);
        break;
    case 27:
        cvSetImageROI(tempsrc1,cvRect(width,0,320-width,240));
        cvSetImageROI(tempsrc2,cvRect(0,0,width,240));
        cvResize(src1,tempsrc1);
        cvResize(src2,tempsrc2);
        cvResetImageROI(tempsrc1);
        cvResetImageROI(tempsrc2);
        cvAdd(tempsrc1,tempsrc2,dest);
        break;
    case 28:
        cvSetImageROI(tempsrc1,cvRect(0,height,320,240-height));
        cvSetImageROI(tempsrc2,cvRect(0,0,320,height));
        cvResize(src1,tempsrc1);
        cvResize(src2,tempsrc2);
        cvResetImageROI(tempsrc1);
        cvResetImageROI(tempsrc2);
        cvAdd(tempsrc1,tempsrc2,dest);
        break;
    case 29:
        cvSetImageROI(tempsrc1,cvRect(0,0,320,240-height));
        cvSetImageROI(tempsrc2,cvRect(0,240-height,320,height));
        cvResize(src1,tempsrc1);
        cvResize(src2,tempsrc2);
        cvResetImageROI(tempsrc1);
        cvResetImageROI(tempsrc2);
        cvAdd(tempsrc1,tempsrc2,dest);
        break;
    }
    cvReleaseImage(&tempsrc1);
    cvReleaseImage(&tempsrc2);
    return TRUE;
}
BOOL ChangeBackWithFly(const IplImage *src1,const IplImage *src2, IplImage *dest,int model, int FrameNum)
{
    //从各个方向飞入/飞出效果。
    //cvCopy(src1,dest);
    int width=320*FrameNum/30;
    int height=240*FrameNum/30;
    IplImage *tempsrc2=cvCreateImage(cvSize(320, 240), 8, 3);
    switch (model)
    {
    case 10:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(0,0,width,240));
        cvSetImageROI(tempsrc2,cvRect(320-width,0,width,240));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 11:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(320-width,0,width,240));
        cvSetImageROI(tempsrc2,cvRect(0,0,width,240));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 12:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(0,0,320,height));
        cvSetImageROI(tempsrc2,cvRect(0,240-height,320,height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 13:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(0,240-height,320,height));
        cvSetImageROI(tempsrc2,cvRect(0,0,320,height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 14:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(0,0,width,height));
        cvSetImageROI(tempsrc2,cvRect(320-width,240-height,width,height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 15:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(0,240-height,width,height));
        cvSetImageROI(tempsrc2,cvRect(320-width,0,width,height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 16:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(320-width,240-height,width,height));
        cvSetImageROI(tempsrc2,cvRect(0,0,width,height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 17:
        cvCopy(src1,dest);
        cvCopy(src2,tempsrc2);
        cvSetImageROI(dest,cvRect(320-width,0,width,height));
        cvSetImageROI(tempsrc2,cvRect(0,240-height,width,height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
        //以下为飞出效果。
    case 18:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(width,0,320-width,240));
        cvSetImageROI(tempsrc2,cvRect(0,0,320-width,240));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 19:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(0,0,320-width,240));
        cvSetImageROI(tempsrc2,cvRect(width,0,320-width,240));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 20:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(0,height,320,240-height));
        cvSetImageROI(tempsrc2,cvRect(0,0,320,240-height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 21:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(0,0,320,240-height));
        cvSetImageROI(tempsrc2,cvRect(0,height,320,240-height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 22:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(0,0,320-width,240-height));
        cvSetImageROI(tempsrc2,cvRect(width,height,320-width,240-height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 23:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(0,height,320-width,240-height));
        cvSetImageROI(tempsrc2,cvRect(width,0,320-width,240-height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 24:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(width,height,320-width,240-height));
        cvSetImageROI(tempsrc2,cvRect(0,0,320-width,240-height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    case 25:
        cvCopy(src2,dest);
        cvCopy(src1,tempsrc2);
        cvSetImageROI(dest,cvRect(width,0,320-width,240-height));
        cvSetImageROI(tempsrc2,cvRect(0,height,320-width,240-height));
        cvCopy(tempsrc2,dest);
        cvResetImageROI(dest);
        cvResetImageROI(tempsrc2);
        break;
    }
    cvReleaseImage(&tempsrc2);
    return TRUE;
}
BOOL ChangeBackWithMask(const IplImage *src1,const IplImage *src2, IplImage *dest,int model, int FrameNum)
{
        //mask从小变大/从大变小。
    IplImage *mask;
    int maskWidth, maskHeight;
    if (model==0||model==1)
    {
        mask=cvLoadImage("mask1.png");
    }
    else if (model==2||model==3)
    {
        mask=cvLoadImage("mask2.png");
    }
    else if (model==4||model==5)
    {
        mask=cvLoadImage("mask3.png");
    }
    else if (model==6||model==7)
    {
        mask=cvLoadImage("mask4.png");
    }
    else if (model==8||model==9)
    {
        mask=cvLoadImage("mask5.png");
    }
    if(model%2==1)
    {
        maskWidth=320*(FrameNum)/10;
        maskHeight=240*(FrameNum)/10;
    }
    else
    {
        maskWidth=320*(31-FrameNum)/10;
        maskHeight=240*(31-FrameNum)/10;
    }
    IplImage *MaskResized=cvCreateImage(cvSize(maskWidth, maskHeight), 8, 3);
    IplImage *newMask=cvCreateImage(cvSize(320,240),8,3);
    IplImage *newMaskInverse=cvCreateImage(cvSize(320,240),8,3);
    IplImage *tempsrc1=cvCreateImage(cvSize(320,240),8,3);
    IplImage *tempsrc2=cvCreateImage(cvSize(320,240),8,3);
    cvResize(mask,MaskResized,CV_INTER_LINEAR);
    if(maskWidth>=320)
    {
        cvSetImageROI(MaskResized,cvRect(maskWidth/2-160, maskHeight/2-120, 320, 240));
        cvCopy(MaskResized,newMask);
        cvResetImageROI(MaskResized);
    }
    else
    {
        cvSetZero(newMask);
        cvSetImageROI(newMask,cvRect(160-maskWidth/2, 120-maskHeight/2, maskWidth, maskHeight));
        cvCopy(MaskResized,newMask);
        cvResetImageROI(newMask);
    }
    cvSubRS(newMask, cvScalar(255,255,255), newMaskInverse); //得到反mask
    if(model%2==1)
    {
        cvAnd(src1,newMaskInverse,tempsrc1);
        cvAnd(src2,newMask,tempsrc2);
    }
    else
    {
        cvAnd(src1,newMask,tempsrc1);
        cvAnd(src2,newMaskInverse,tempsrc2);
    }
    cvAdd(tempsrc1,tempsrc2,dest);
    cvResetImageROI(newMask);
    cvResetImageROI(newMaskInverse);
    cvReleaseImage(&mask);
    cvReleaseImage(&MaskResized);
    cvReleaseImage(&newMask);
    cvReleaseImage(&newMaskInverse);
    cvReleaseImage(&tempsrc1);
    cvReleaseImage(&tempsrc2);
    return TRUE;
}

(mjh1021)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201111/15284.html]
本文出处:blog.csdn.net/mjh1021 作者:mjh1021
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容