基于OpenCV的视频图像组态 (4) :劈裂动画效果

写在前面

本系列博客URL:

http://www.cnblogs.com/drgraph

http://blog.csdn.net/arwen

配套软件下载地址:

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

配套软件含四个可执行文件:DrGraph.exe,YeeVingDriver.exe,YeeVingPlayer.exe,WatchDog.exe

其中,

DrGraph.exe为图形博士软件,可进行电路定量分析及其应用。

YeeVingDriver.exe是双目触控屏的驱动程序,内含键盘鼠标钩子,安装或运行的时候有可能会当成病毒。

WatchDog.exe是无人值守软件

YeeVingPlayer.exe是广告播放软件客户端。

本系列博客是在上述四个软件研发过程中的片面记录,基本上是属于想到哪写到哪的,不系统。主要目的是自己整理归纳一下,并期望与更多朋友交流。

QQ/微信:282397369

EMail: drgraph@qq.com

 

劈裂效果

劈裂效果:显示目标区域位置不变,显示内容(原始阵不变,屏蔽阵变化 -> 显示内容变化)

 

enum CbwSplitDirection { // 劈裂方向

    csdVertCollapse = 0, // 上下向中央收缩

        csdVertExpand = 1, // 中央向上下展开

        csdHorzCollapse = 2, // 左右向中央收缩

        csdHorzExpand = 3 // 中央向左右展开

    };

 

bool __fastcall TCbwAnimationEffect_Split::BuildMaskMat(cv::Mat& destMat,

    cv::Mat& srcMat, TRect displayRect) {

    TRect wholeRect(0, 0, displayRect.right - displayRect.left,

        displayRect.bottom - displayRect.top);

    TRect partRect = wholeRect;

    double cx = partRect.right / 2.0, cy = partRect.bottom / 2.0;

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

    bool vertFlag = (effectOptionType <= csdVertExpand);

    double delta = double(FCurrentIndex + 1) / FTotalFramesInOnePeriod * (vertFlag ?

        cy : cx);

    if (csdVertExpand == effectOptionType) { // 上下向中央收缩

        partRect.top = cy - delta;

        partRect.bottom = cy + delta;

    }

    if (csdVertCollapse == effectOptionType) { // 中央向上下展开

        partRect.top = delta;

        partRect.bottom = 2 * cy - delta;

    }

    if (csdHorzExpand == effectOptionType) { // 左右向中央收缩

        partRect.left = cx - delta;

        partRect.right = cx + delta;

    }

    if (csdHorzCollapse == effectOptionType) { // 中央向左右展开

        partRect.left = delta;

        partRect.right = 2 * cx - delta;

    }

    bool expandFlag =

        (csdVertExpand == effectOptionType ||

        csdHorzExpand == effectOptionType);

 

    BYTE * pSrc = srcMat.data;

    BYTE * pDst = destMat.data;

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

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

            bool hasValueFlag = (*pSrc++ != 0);

            if (!hasValueFlag)

                * pDst = 0;

            int y = (row - partRect.top) * (partRect.bottom - row);

            int x = (col - partRect.left) * (partRect.right - col);

            bool inFlag = (y >= 0 && x >= 0);

            if (!expandFlag)

                inFlag = (y > 0 && x > 0);

            bool setFlag = (inFlag == expandFlag);

            *pDst++ = (setFlag ? 255 : 0);

        }

    return true;

}

结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值