1. 程式人生 > >基於OpenCV的視頻組態 (3):常見PPT動畫1

基於OpenCV的視頻組態 (3):常見PPT動畫1

app 基本 rom font uil 簡單 ren .net 記錄

寫在前面

本系列博客URL:

http://www.cnblogs.com/drgraph

http://blog.csdn.net/arwen

配套軟件下載地址:

http://www.czwenwu.com/YeeVingSetup.exe

配套軟件含三個可執行文件:YeeVingDriver.exe,YeeVingPlayer.exe,WatchDog.exe

其中,YeeVingDriver.exe是雙目觸控屏的驅動程序,內含鍵盤鼠標鉤子,安裝或運行的時候有可能會當成病毒。

WatchDog.exe是無人值守軟件

YeeVingPlayer.exe是廣告播放軟件客戶端。

本系列博客是在上述三個軟件研發過程中的片面記錄,基本上是屬於想到哪寫到哪的,不系統。主要目的是自己整理歸納一下,並期望與更多朋友交流。

QQ/微信:282397369

EMail: [email protected]

動畫派生繼承

書接上回,有了動畫基類,再處理各個動畫效果,就只需要重載實現各自的顯示區域、顯示矩陣與屏蔽矩陣。

比如淡出、飛入、浮入、彈跳幾個動畫效果,可以簡單總結列成下表。

動畫類型

顯示區域

顯示矩陣

屏蔽陣

缺省

=最終的顯示區域

=最終的顯示矩陣圖像

=缺省屏蔽陣

TCbwAnimationEffect_FadeOut

淡出

不變

亮度變化

不變

TCbwAnimationEffect_FlyIn

飛入

區域大小不變

變動左上角位置(線性)

不變

不變

TCbwAnimationEffect_FloatIn

浮入

區域大小不變

變動左上角位置(線性)

漸顯,亮度變化

不變

TCbwAnimationEffect_Bounce

彈跳

區域大小不變

變動左上角位置(彈性)

不變

不變

類型定義

初步進行類型劃分定義:

enum
CbwEffectType { // 效果類型枚舉量  cetBase = 0, // TCbwAnimationEffect cetAppear = 1, // TCbwAnimationEffect_Appear cetFadeOut = 2, // TCbwAnimationEffect_FadeOut cetFlyIn = 3, // TCbwAnimationEffect_FlyIn cetFloatIn = 4, // TCbwAnimationEffect_FloatIn cetSplit = 5, // TCbwAnimationEffect_Split cetErase = 6, // TCbwAnimationEffect_Erase cetShape = 7, // TCbwAnimationEffect_Shape cetWheel = 8, // TCbwAnimationEffect_Wheel cetRandomLine = 9, // TCbwAnimationEffect_RandomLine cetRotateToNear = 10, // TCbwAnimationEffect_RotateToNear cetZoomEffect = 11, // TCbwAnimationEffect_Zoom cetRotateEffect = 12, // TCbwAnimationEffect_Rotate cetBounce = 13, // TCbwAnimationEffect_Bounce };

實現代碼

class TCbwAnimationEffect_FadeOut : public TCbwAnimationEffect { // 淡出

    virtual void __fastcall BuildDisplayMat(cv::Mat& destMat, cv::Mat& srcMat,

        TRect displayRect);

    CBW_ANIMATION_OBJECT(TCbwAnimationEffect_FadeOut, TCbwAnimationEffect, cetFadeOut);

};

 

class TCbwAnimationEffect_FlyIn : public TCbwAnimationEffect { // 飛入

    virtual TRect __fastcall BuildDisplayRect(OBJECTMAT * m);

    CBW_ANIMATION_OBJECT(TCbwAnimationEffect_FlyIn, TCbwAnimationEffect, cetFlyIn);

};

 

class TCbwAnimationEffect_FloatIn : public TCbwAnimationEffect { // 浮入

    virtual TRect __fastcall BuildDisplayRect(OBJECTMAT * m);

    virtual void __fastcall BuildDisplayMat(cv::Mat& destMat, cv::Mat& srcMat,

        TRect displayRect);

    CBW_ANIMATION_OBJECT(TCbwAnimationEffect_FloatIn, TCbwAnimationEffect, cetFloatIn);

};

 

class TCbwAnimationEffect_Bounce : public TCbwAnimationEffect { // 彈跳

    virtual TRect __fastcall BuildDisplayRect(OBJECTMAT * m);

 

    CBW_ANIMATION_OBJECT(TCbwAnimationEffect_Bounce, TCbwAnimationEffect, cetBounce);

};

void __fastcallTCbwAnimationEffect_FadeOut::BuildDisplayMat(cv::Mat& destMat,

         cv::Mat&srcMat) {

         for(int y = 0; y < destMat.rows; y++) {

                   for(int x = 0; x < destMat.cols; x++) {

                            for(int c = 0; c < 3; c++) {

                                     BYTEvalue = srcMat.at<cv::Vec3b>(y, x)[c];

                                     value= 255 - FCurrentIndex / double(FPeriodLength) *

                                               (255- value);

                                     destMat.at<cv::Vec3b>(y,x)[c] =

                                               cv::saturate_cast<uchar>(value);

                            }

                   }

         }

}

 

TRect __fastcall TCbwAnimationEffect_FlyIn::BuildDisplayRect(OBJECTMAT * m) {

    TPoint startPos(m->FinalRect.left, m->FinalRect.top),

        endPos(m->FinalRect.left, m->FinalRect.top);

    int effectOptionType = MyOptionType.Items[1].CurrentValue;

    if (cedFromBottom == effectOptionType ||

        cedFromLeftBottom == effectOptionType ||

        cedFromRightBottom == effectOptionType) // 自底部

            startPos.y = FContraintHeight;

    if (cedFromTop == effectOptionType || cedFromLeftTop == effectOptionType ||

        cedFromRightTop == effectOptionType) // 自頂部

            startPos.y = -m->FinalMat.rows;

    if (cedFromLeft == effectOptionType ||

        cedFromLeftBottom == effectOptionType ||

        cedFromLeftTop == effectOptionType) // 自左側

            startPos.x = -m->FinalMat.cols;

    if (cedFromRight == effectOptionType ||

        cedFromRightBottom == effectOptionType ||

        cedFromRightTop == effectOptionType) // 自右側

            startPos.x = FContraintWidth;

    int x = startPos.x + (endPos.x - startPos.x) * (FCurrentIndex + 1)

        / FTotalFramesInOnePeriod;

    int y = startPos.y + (endPos.y - startPos.y) * (FCurrentIndex + 1)

        / FTotalFramesInOnePeriod;

    TRect result(x, y, x + m->FinalMat.cols, y + m->FinalMat.rows);

    return result;

}

 

TRect __fastcall TCbwAnimationEffect_FloatIn::BuildDisplayRect(OBJECTMAT * m) {

    TPoint startPos(m->FinalRect.left, m->FinalRect.top),

        endPos(m->FinalRect.left, m->FinalRect.top);

    int delta = 100;

    int effectOptionType = MyOptionType.Items[1].CurrentValue;

    if (cfdUp == effectOptionType) // 上浮

            startPos.y = endPos.y + delta;

    if (cfdDown == effectOptionType) // 下浮

            startPos.y = endPos.y - delta;

    int x = startPos.x + (endPos.x - startPos.x) * (FCurrentIndex + 1)

        / FTotalFramesInOnePeriod;

    int y = startPos.y + (endPos.y - startPos.y) * (FCurrentIndex + 1)

        / FTotalFramesInOnePeriod;

    TRect result(x, y, x + m->FinalMat.cols, y + m->FinalMat.rows);

    return result;

}

 

void __fastcall TCbwAnimationEffect_FloatIn::BuildDisplayMat(cv::Mat& destMat,

    cv::Mat& srcMat, TRect displayRect) {

    InnerTrans_FadeOut(destMat, srcMat);

}

 

TRect __fastcall TCbwAnimationEffect_Bounce::BuildDisplayRect(OBJECTMAT * m) {

    double x = double(FCurrentIndex + 1) / FTotalFramesInOnePeriod;

    double v = sin((x - 1) * 3 * PI);

 

    double y = fabs(200 * v / exp(0.3 * (x - 1)));

    y = m->FinalRect.top - y;

    x = m->FinalRect.left + (x - 1) * 500;

    TRect result(x, y, x + m->FinalMat.cols, y + m->FinalMat.rows);

    return result;

}

運行演示

技術分享

基於OpenCV的視頻組態 (3):常見PPT動畫1