您的位置:首页 > 运维架构

基于OpenCV的视频图像组态 (8) :随机线条动画效果

2017-12-09 12:15 696 查看
随机线条效果实现

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
]) {

totalLines.erase(totalLines.begin() + n);

n = random(totalLines.size());

}

FOccurredLines[totalLines
] = 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;

}


 

演示效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: