Master Keyer技术文档
1.0版本
目 录
15.4.2.1、getCaptureVideoFxByIndex. 6
15.4.2.3、sampleColorFromCapturedVideoFrame. 7
15、抠像技术文档
前置说明:
美摄SDK抠像技术在拍摄和编辑时都可应用,本文档适用于拍摄。对于编辑应用,请参考美摄相关文档。
15.1、抠像
“抠像”一词来源于早期电视制作,英文称作“Key”。吸取画面中的某一种颜色作为透明色,将透明色从画面中抠去,使背景透出来,形成二层画面的叠加合成。可以使拍摄的人物经抠像后与其它景物叠加在一起,形成神奇的艺术效果。
美摄SDK非线性编辑软件,巧妙地应用其中的Key功能,并与其它特技配合,达到高质量的抠像效果。
15.2、素材要求
所有的画面都可以抠像,如果实现比较好的抠像效果,最好流媒体前景与背景色差区别明显,色调不要过于接近,背景铺光要匀称。这样抠像效果最佳。
15.3、如何利用美摄SDK进行抠像开发
15.3.1、总体思想
美摄SDK的很多功能实现是通过特效来进行实现的,抠像也不例外。抠像的实现是对流媒体添加特效。
为了方便广大开发人员编程,抠像和AR Scene一样,都是通过字符串参数ID进行标记。通过Maseter Keyer参数ID构造特效对象,然后进行相关参数设定。
抠像实现的本质是在当前流媒体界面上把一些相近颜色用其它颜色进行替代。用户在流媒体界面上发出事件,程序捕获用户点击范围,采集范围颜色,把界面上和范围相近的颜色用其它颜色来取代。
15.3.2、抠像参数ID
通过字符串参数ID,方便开发者应用,Master Keyer整体代表抠像特技。在Master Keyer下有禁用预乘、靶色、收缩边界强度、柔软度修正、溢色去除、溢色去除强度。根据实际需要,通过特效对象,进行相关参数设置。
标号 | 名 字 | 解 释 | 类型 | 最大 | 最小 | 默认 |
01 | Master Keyer | 代表抠像 |
|
|
|
|
02 | Disable Premultiply | 禁用预乘 | BOOL |
|
| false |
03 | Key Color | 靶色 | COLOR |
|
| 0,0,0 |
04 | Shrink Intensity | 收缩边界强度 | FLOAT | 1.0 | 0.0 | 0.0 |
05 | Softeness Amendment | 柔软度修正 | FLOAT | 1.0 | -1.0 | 0.0 |
06 | Spill Removal | 溢色去除 | BOOL |
|
| false |
07 | Spill Removal Intensity | 溢色去除强度 | FLOAT | 1.0 | 0.0 | 0.25 |
特别说明:在表格中,最大值与最小值是相对的,小的代表弱化,大的代表增强。
15.4、类与函数
在本部分中,用到NvsColor和RectF类,对于特效编程其它类,参考前面相关文档。
15.4.1、NvsColor类
美摄SDK封装的颜色类,是对r(红色),g(绿色),b(蓝色)以及a(透明度)的封装。
Public 成员函数
NvsColor (float r, float g, float b, float a)
Public 属性
float r 红色
float g 绿色
float b 蓝色
float a 透明度
SDK中,NvsColor类属性r,g,b,a取值范围是[0,1],而非[0,255]。
构造及析构函数说明:
不带参数构造函数:
NvsColor()
带参数构造函数:
NvsColor
(
float r,
float g,
float b,
float a
)
15.4.2、相关函数
相同名字的函数参考前面文档。本文档仅列出前面没有讲述过的函数。
15.4.2.1、getCaptureVideoFxByIndex
获取采集视频特效。
原型:
NvsCaptureVideoFx NvsStreamingContext.getCaptureVideoFxByIndex(int captureVideoFxIndex)
参数:
captureVideoFxIndex 视频特效索引
返回:
返回视频特效对象
15.4.2.2、setColorVal()
给相关特效设置参数值。
原型:
void com.meicam.sdk.NvsFx.setColorVal(String fxParam,NvsColor val)
设置特效颜色值参数值
参数:
fxParam 特效的颜色参数的类型。请参见PARAM_TYPE_COLOR
val NvsColor自定义颜色对象
15.4.2.3、sampleColorFromCapturedVideoFrame
采集区域颜色值。
原型:
NvsColor com.meicam.sdk.NvsStreamingContext.sampleColorFromCapturedVideoFrame(RectF sampleRect)
对采集设备的视频帧内容进行采样
参数:
sampleRect:采样的矩形区域,坐标为实时预览窗口的自身坐标系
返回:
返回值为采样的颜色值,该颜色值是采样的矩形区域内所有像素颜色的平均值
15.5、开发内容
15.5.1、开发准备
开发者首先申请摄像头权限,创建流媒体上下文(Streaming Context)对象,流媒体窗口显示NvsLiveWindow对象,并进行预览。
对象声明
private NvsLiveWindow m_liveWindow;
public NvsStreamingContext m_streamingContext;
String licensePath = "assets:/meishesdk.lic";
对象定义
m_streamingContext = NvsStreamingContext.init(getApplicationContext(), licensePath, NvsStreamingContext.STREAMING_CONTEXT_FLAG_SUPPORT_4K_EDIT);
m_liveWindow = (NvsLiveWindow) findViewById(R.id.liveWindow);
m_streamingContext.connectCapturePreviewWithLiveWindow(m_liveWindow);
15.5.2、画面颜色采样
从点击位置采集背景画面的颜色值。封装为成员函数
矩形区域定位算法比较简单,不做讲述。
private NvsColor getColorFromLiveWindow(MotionEvent event) {
//矩形位置定位
int sampleWidth = 20;
int sampleHeight = 20;
RectF sampleRect = new RectF();
sampleRect.left = (int) (event.getX() - sampleWidth / 2);
if (sampleRect.left < 0) {
sampleRect.left = 0;
} else if (sampleRect.left + sampleWidth > m_liveWindow.getWidth()) {
sampleRect.left = m_liveWindow.getWidth() - sampleWidth;
}
sampleRect.top = (int) (event.getY() - sampleHeight / 2);
if (sampleRect.top < 0) {
sampleRect.top = 0;
} else if (sampleRect.top + sampleHeight > m_liveWindow.getHeight()) {
sampleRect.top = m_liveWindow.getHeight() - sampleHeight;
}
sampleRect.right = sampleRect.left + sampleWidth;
sampleRect.bottom = sampleRect.top + sampleHeight;
//采集位置颜色,并返回
return m_streamingContext.sampleColorFromCapturedVideoFrame(sampleRect);
}
15.5.3、事件处理
抠像的参数ID
private final String NAME = "Master Keyer";
m_liveWindow.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//判断是否添加过抠像特技,如果没有添加,则添加.不要重复添加。
if (!isContainCaptureVideoFxByName(NAME)) {
appendBuiltinCaptureVideoFx();
}
//调用上面函数
NvsColor sampledColor = getColorFromLiveWindow(event);
/*
* 将吸取下来的背景画面颜色值设置给抠像特技
* Set the extracted background color value to the keying effect
* */
//判断是否有特效对象
NvsCaptureVideoFx keyerFx = m_streamingContext.getCaptureVideoFxByIndex(0);
if (keyerFx == null) {
return false;
}
//设置抠像颜色
keyerFx.setColorVal("Key Color", sampledColor);
return true;
}
});
15.5.4、抠像特效设置
private final String NAME = "Master Keyer";
//生成抠像对象
NvsCaptureVideoFx keyerFx = m_streamingContext.appendBuiltinCaptureVideoFx(NAME);
//对抠像对象进行技术处理
if (keyerFx != null) {
/*
* 开启溢色去除
* Turn on overflow color removal
* */
keyerFx.setBooleanVal("Spill Removal", true);
/*
* 将溢色去除强度设置为最低
* Set the overflow color removal intensity to minimum
* */
keyerFx.setFloatVal("Spill Removal Intensity", 0);
/*
* 设置收缩边界强度
* Set shrink border strength
* */
keyerFx.setFloatVal("Shrink Intensity", 0.4);
}
15.5.5、运行效果