利用 Avisynth 2.5.8 的 ColorKeyMask 功能实现视频抠像
下载安装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.htm2.要修改的函数 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 功能实现视频抠像的更多相关文章
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- ASP.net(C#)利用SQL Server实现注册和登陆功能
说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...
- 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)
利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...
- 利用 Android 系统原生 API 实现分享功能
利用 Android 系统原生 API 实现分享功能 这篇文章提供一个封装好的 Share2 库供大家参考. GitHub 项目地址:Share2 大家知道,要调用 Android 系统内建的分享功能 ...
- 利用SharedPreferences完成记住账号密码的功能
利用SharedPreferences完成记住账号密码的功能 效果图: 记住密码后,再次登录就会出现账号密码,否则没有. 分析: SharedPreferences可将数据存储到本地的配置文件中 Sh ...
- c# wpf 利用截屏键实现截屏功能
原文:c# wpf 利用截屏键实现截屏功能 最近做一个wpf程序需要截图功能,查找资料费了一些曲折,跟大家分享一下. 先是找到了这样一份代码: static class Scr ...
- 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...
- DevExpress v15.2新功能介绍视频(25集全)
DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...
- Java:利用java Timer类实现定时执行任务的功能
一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...
随机推荐
- struts2理解
(1) Struts2(一)---struts2的环境搭建及实例 (2) struts2(二)---ModelDriven模型驱动 (3) Struts2属性驱动与模型驱动 (4)
- BZOJ-3212 Pku3468 A Simple Problem with Integers 裸线段树区间维护查询
3212: Pku3468 A Simple Problem with Integers Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1278 Sol ...
- jsp中 response和request区别
1.response 属于重定向请求: 其地址栏的URL会改变: 会向服务器发送两次请求: 2. request 属于请求转发: 其地址栏的URL不会改变: 向服务器发送一次请求: 举一个区分它们的简 ...
- 在cmd下编译一个简单的servlet时出现程序包javax.servlet不存在
由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决“软件包 javax.servlet不存 ...
- windows搭建openacs编译环境
1.下载ant工具用来编译openacs源码 apache-ant-1.8.2 下载地址http://ant.apache.org/ 这个文件不用编译,在目录bin/下有针对windows的ant 2 ...
- Ubuntu学习总结-01 用VMware 8安装Ubuntu 12.04详细过程
1 Ubuntu 下载地址 http://www.ubuntu.com/download/desktop 2 安装Ubuntu 转载用VMware 8安装Ubuntu 12.04详细过程 http:/ ...
- App接口中json方式封装通信接口
封装json通信接口的类 <?php class Response{ /** * 按json方式输出通信数据 * @param integer $code状态码 * @param string ...
- Protocol Buffer技术详解(C++实例)
Protocol Buffer技术详解(C++实例) 这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较 ...
- 我对 impress.js 源码的理解
源码看了两天,删掉了一些优化,和对 ipad 的支持,仅研究了其核心功能的实现,作以下记录. HTML 结构如下: <!doctype html> <html lang=" ...
- udf提权方法和出现问题汇总
一.适用条件 1.目标系统是Windows(Win2000,XP,Win2003): 2.你已经拥有MYSQL的某个用户账号,此账号必须有对mysql的insert和delete权限以创建和抛弃函数( ...