下载安装Avisynth 2.5.8 + 下载安装 FFMpeg
编写 Avisynth 脚本 mating.avs
----------------------------------------------------------------------------------
video1 = AVISource ("背景.avi").ConvertToRGB32
video2 = AVISource ("前景.avi").ConvertToRGB32.colorkeymask($45D168,40).Blur(0,1)
Layer(video1,video2,"add",255,0,0)
----------------------------------------------------------------------------------
然后编写批处理 play.bat
----------------------------------------------------------------------------------
ffplay "mating.avs" -loop 0
----------------------------------------------------------------------------------
运行play.bat
----------------------------------------------------------------------------------
缺点:边界过度不够自然
优点:处理速度较快

下面是优化方案
1.下载 Avisynth 2.5.8 源代码(用VC + MASM32) Avisynth_258_src.zip
http://sourceforge.net/projects/avisynth2/files/AviSynth%202.5/AviSynth%202.5.8/

说明:需要VC6 + MASM32 汇编

MASM32 汇编 下载地址
http://www.masm32.com/masmdl.htm

2.要修改的函数 ColorKeyMask::GetFrame(int n, IScriptEnvironment *env)

Avisynth_258_src.zip 解压到一个 .\avisynth_2.5.8\ 目录
...\avisynth_2.5.8\src\filters\layer.cpp 文件中有这个函数
原先的函数使用 IsClose 函数过滤 去掉设置相近的颜色
要优化的部分在 ColorKeyMask::GetFrame 函数内

static __inline bool IsClose(int a, int b, unsigned threshold)
{
return (unsigned(a-b+threshold) GetFrame(n, env);
env->MakeWritable(&frame);

BYTE* pf = frame->GetWritePtr();
const int pitch = frame->GetPitch();
const int rowsize = frame->GetRowSize();

if (!(env->GetCPUFlags() & CPUF_MMX) || vi.width==1)
{
const int R = (color >> 16) & 0xff;
const int G = (color >> 8) & 0xff;
const int B = color & 0xff;

for (int y=0; y 255
// pf[x+(0-2)]是 RGB 值 pf[x+3] alpha值
// 从 pf 到 pf + pitch 是 一帧图像中的一行
// 这部分代码写出来之后可能不超过 100 行,就是算法需要好好研究

//...

//在这里添加进行边缘模糊的算法 结束

}
pf += pitch;
}
}
else // MMX 这部分是为了加快处理速度 使用 MMX 指令集, 优化时暂不考虑这部分
{
const int height = vi.height;
const int col8 = color;
const int tol8 = 0xff000000 | (tolR

利用 Avisynth 2.5.8 的 ColorKeyMask 功能实现视频抠像的更多相关文章

  1. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  2. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

  3. 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)

    利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...

  4. 利用 Android 系统原生 API 实现分享功能

    利用 Android 系统原生 API 实现分享功能 这篇文章提供一个封装好的 Share2 库供大家参考. GitHub 项目地址:Share2 大家知道,要调用 Android 系统内建的分享功能 ...

  5. 利用SharedPreferences完成记住账号密码的功能

    利用SharedPreferences完成记住账号密码的功能 效果图: 记住密码后,再次登录就会出现账号密码,否则没有. 分析: SharedPreferences可将数据存储到本地的配置文件中 Sh ...

  6. c# wpf 利用截屏键实现截屏功能

    原文:c# wpf 利用截屏键实现截屏功能     最近做一个wpf程序需要截图功能,查找资料费了一些曲折,跟大家分享一下.     先是找到了这样一份代码:     static class Scr ...

  7. 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...

  8. DevExpress v15.2新功能介绍视频(25集全)

    DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...

  9. Java:利用java Timer类实现定时执行任务的功能

    一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...

随机推荐

  1. 【poj1962】 Corporative Network

    http://poj.org/problem?id=1962 (题目链接) 时隔多年又一次写带权并查集. 题意 n个节点,若干次询问,I x y表示从x连一条边到y,权值为|x-y|%1000:E x ...

  2. Ubuntu 12.10安装OpenGL

    http://wiki.ubuntu-tw.org/index.php?title=Howto_Install_OpenGL_Development_Environment 前言 OpenGL 是一套 ...

  3. POJ2676Sudoku(类似于八皇后)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16444   Accepted: 8035   Special ...

  4. [Python] Python 之 __new__() 方法与实例化

    __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() ...

  5. display & visibility区别

    http://www.cnblogs.com/zhangran/archive/2012/08/29/2662459.html 说明:在学习css的过程中由于其中包含太多的元素.属性等等,总有许多是自 ...

  6. visual studio 2010 破解版 破解方法

    1.Microsoft Visual Studio 2010下载(均来自微软官网) 高级版(Premium) [建议下载]       http://download.microsoft.com/do ...

  7. 我的电脑右下角的日期也不见了只剩下时间,Win7系统,请问是什么原因啊?

    A:今天是2013/10/10,日期变为八位,宽度就不够了,把任务栏拉宽就好了 Q:win7 任务栏时间区可以拉宽吗?使之显示日期等 A:你的任务栏锁定了的,右键单击任务栏-锁定任务栏前面的勾去掉,鼠 ...

  8. linux挂载硬盘失败,报错!

    剛把我的一顆硬碟 ( NTFS ) 接到 Ubuntu 桌機上. 然後要 mount  的時候,出現了下面的訊息: DBus error org.gtk.Private.RemoteVolumeMon ...

  9. 【原创】ui.router源码解析

    Angular系列文章之angular路由 路由(route),几乎所有的MVC(VM)框架都应该具有的特性,因为它是前端构建单页面应用(SPA)必不可少的组成部分. 那么,对于angular而言,它 ...

  10. C++ Primer Plus第6版18个重点笔记

    下面是我看<C++ Primer Plus>第6版这本书后所做的笔记,作为备忘录便于以后复习. 笔记部分 C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有 ...