基於OpenCV的視訊影象組態 (8) :隨機線條動畫效果
阿新 • • 發佈:2019-01-27
隨機線條效果實現
class TCbwAnimationEffect_RandomLine : public TCbwAnimationEffect { // 隨機線 virtual bool __fastcall BuildMaskMat(cv::Mat& destMat, cv::Mat& srcMat, TRect displayRect); BYTE * FOccurredLines; public: __fastcall TCbwAnimationEffect_RandomLine(); }; __fastcall TCbwAnimationEffect_RandomLine::TCbwAnimationEffect_RandomLine() : TCbwAnimationEffect() { EffectType = cetRandomLine; FOccurredLines = NULL; } bool __fastcall TCbwAnimationEffect_RandomLine::BuildMaskMat(cv::Mat& destMat, cv::Mat& srcMat, TRect displayRect) { bool horzFlag = (MyOptionType.Items[1].CurrentValue == 0); // 方向 TRect wholeRect(0, 0, displayRect.right - displayRect.left, displayRect.bottom - displayRect.top); int totalLineNumber = (horzFlag ? wholeRect.bottom : wholeRect.right); int number = double(FCurrentIndex + 1) / FTotalFramesInOnePeriod * totalLineNumber; if (!FOccurredLines) { FOccurredLines = new BYTE[totalLineNumber]; ZeroMemory(FOccurredLines, totalLineNumber); } int destNumber = number -int(double(FCurrentIndex) / FTotalFramesInOnePeriod * totalLineNumber); BYTE * pDst = destMat.data; vector<int>totalLines; for (int i = 0; i < totalLineNumber; ++i) totalLines.push_back(i); while (destNumber-- > 0 && totalLines.size()) { int n = random(totalLines.size()); while (FOccurredLines[totalLines[n]]) { totalLines.erase(totalLines.begin() + n); n = random(totalLines.size()); } FOccurredLines[totalLines[n]] = 1; totalLines.erase(totalLines.begin() + n); } for (int row = 0; row < destMat.rows; ++row) for (int col = 0; col < destMat.cols; ++col) { bool inFlag = (horzFlag ? FOccurredLines[row] : FOccurredLines[col]); *pDst++ = inFlag ? 255 : 0; } if (FCurrentIndex == FTotalFramesInOnePeriod - 1) { delete FOccurredLines; FOccurredLines = NULL; } return true; }
演示效果