基於OpenCV的視頻組態 (3):常見PPT動畫1
寫在前面
本系列博客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 彈跳 |
區域大小不變 變動左上角位置(彈性) |
不變 |
不變 |
類型定義
初步進行類型劃分定義:
enumCbwEffectType { // 效果類型枚舉量 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