Chroma Key
如上所说,项目对接外部实现的vulkan层是否方便,在这重新生成一个模块aoce_vulkan_extra,在这我选择UE4 Matting里的逻辑来测试,因为这个逻辑非常简单,也算让我对手机的性能有个初步的了解。

首先把相关逻辑整理下,UE4上有相关节点,看下实现整理成glsl compute shader实现。

#version 450

// https://www.unrealengine.com/en-US/tech-blog/setting-up-a-chroma-key-material-in-ue4

layout (local_size_x = 16, local_size_y = 16) in;// gl_WorkGroupSize
layout (binding = 0, rgba8) uniform readonly image2D inTex;
layout (binding = 1, rgba8) uniform image2D outTex;

layout (std140, binding = 2) uniform UBO {
// 0.2 控制亮度的强度系数
float lumaMask;
float chromaColorX;
float chromaColorY;
float chromaColorZ;
// 用环境光补受蓝绿幕影响的像素(简单理解扣像结果要放入的环境光的颜色)
float ambientScale;
float ambientColorX;
float ambientColorY;
float ambientColorZ;
// 0.4
float alphaCutoffMin;
// 0.5
float alphaCutoffMax;
float alphaExponent;
// 0.8
float despillCuttofMax;
float despillExponent;
} ubo;

const float PI = 3.1415926;

vec3 extractColor(vec3 color,float lumaMask){
float luma = dot(color,vec3(1.0f));
// 亮度指数
float colorMask = exp(-luma2PI/lumaMask);
// color*(1-colorMask)+color*luma
color = mix(color,vec3(luma),colorMask);
// 生成基于亮度的饱和度图
return color / dot(color,vec3(2.0));
}

void main(){
ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
ivec2 size = imageSize(outTex);
if(uv.x >= size.x || uv.y >= size.y){
return;
}
vec3 inputColor = imageLoad(inTex,uv).rgb;
vec3 chromaColor = vec3(ubo.chromaColorX,ubo.chromaColorY,ubo.chromaColorZ);
vec3 ambientColor = vec3(ubo.ambientColorX,ubo.ambientColorY,ubo.ambientColorZ);
vec3 color1 = extractColor(chromaColor,ubo.lumaMask);
vec3 color2 = extractColor(inputColor,ubo.lumaMask);
vec3 subColor = color1 - color2;
float diffSize = length(subColor);
float minClamp = diffSize-ubo.alphaCutoffMin;
float dist = ubo.alphaCutoffMax - ubo.alphaCutoffMin;
// 扣像alpha
float alpha= clamp(pow(max(minClamp/dist,0),ubo.alphaExponent),0.0,1.0);
// 受扣像背景影响的颜色alpha
float inputClamp = ubo.despillCuttofMax - ubo.alphaCutoffMin;
float despillAlpha = 1.0f- clamp(pow(max(minClamp/inputClamp,0),ubo.despillExponent),0.0,1.0);
// 亮度系数
vec3 lumaFactor = vec3(0.3f,0.59f,0.11f);
// 添加环境光收益
vec3 dcolor = inputColorlumaFactorambientColorubo.ambientScaledespillAlpha;
// 去除扣像背景
dcolor -= inputColorchromaColordespillAlpha;
dcolor += inputColor;
// 为了显示查看效果,后面屏蔽
dcolor = inputColoralpha + ambientColor(1.0-alpha);
imageStore(outTex,uv,vec4(dcolor,alpha));
}
这里面代码最后倒数第二句实现混合背景时去掉,在这只是为了显示查看效果。

然后引用aoce_vulkan里给的基类VkLayer,根据接口完成本身具体实现,相关VkChromKeyLayer的实现可以说是非常简单,至少我认为达到我想要的方便。

还是一样,先说遇到的坑,

开始在glsl中的UBO,我特意把一个float,vec3放一起,想当然的认为是按照vec4排列,这里注意,vec3不管前后接什么,大部分结构定义下,都至少占vec4,所以后面为了和C++结构align一样,全部用float.

层启用/不启用会导致整个运算graph重置,一般情况下,运算线程与结果输出线程不在一起,在重置时,运算线程相关资源会重新生成,而此时输出线程还在使用相关资源就会导致device lost错误,在这使用VkEvent用来表示是否在资源重置中。

然后就是与android UI层对接,android的UI没怎么用过,丑也就先这样吧。

在Android用vulkan完成蓝绿幕扣像相关推荐

  1. ue4 android vulkan,在Android用vulkan完成蓝绿幕扣像

    效果图(1080P处理) 因为摄像头开启自动曝光,画面变动时,亮度变化导致扣像在转动时如上. 这个demo主要测试二点,一是测试ndk camera集成效果,二是本项目对接外部实现的vulkan层是否 ...

  2. 基于OpenCV的绿幕抠像与图像融合

    一.背景知识         Keying,即抠像,从一幅图像中提取所要的前景,让它与背景分离起来.Key通常只包含一个通道,是一幅黑白图像,通常黑色的区域(0)代表完全透明,而白色区域(1)代表完全 ...

  3. 编程去除背景绿幕抠图,基于.NET+OpenCVSharp

    摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时"抠人像.替换背景"的方式,对于项目中的算法进行了分析.本文中给出了简化OpenCVSharp中Mat.M ...

  4. 蓝松绿幕抠图使用说明

    文章目录 提供两种形式. 方式1: 业务功能型 形式2: 纯净API类型 集成说明 常见问答 1. 如何支持多机位. 2. 如何支持合流 3. 绿色物体不想被抠去怎么办? 4. 如何推流 5. 如何外 ...

  5. Android OpenGLES Camera2绿幕抠图

    真的是不能乱立flag,刚说完没啥事就给我来事了,这次要我试试手机摄像头的绿幕抠图,我说这玩意儿效果怎么样无法保证,毕竟是实时的,无法做到象后期那样精细的抠图 先看效果 只能说还行,绿边还是有的 sh ...

  6. Android OpenGL ES(八) - 简单实现绿幕抠图

    image.png 实现绿幕抠图,其实想法很简单. 这里简单粗暴的使用着色器替换. OES Filter 直接实现在相机预览上的Shader #extension GL_OES_EGL_image_e ...

  7. 绿幕抠图SDK技术对比

    复杂度 现实环境的影响:绿色不是一个固定的像素值, 它会随光线亮暗,绿布的颜色, 相机的成像质量,反光,色溢等各种因素影响,所以不能用简单的判断一个像素值,就认为是绿或不绿:也不是一个平滑过度的值,比 ...

  8. 绿幕直播、虚拟直播的总结

    前言: 2021年春节前和春节后的两三个月, 对接了一些绿幕直播的客户, 我们自己去做直播, 出差去拜访主播,在不同的手机上测试绿幕直播的性能,去聊,去看,思考, 见过很多客户,发现对绿幕直播的认知, ...

  9. 视频制作中的绿幕与拜耳阵列

    先来欣赏一些大片背后的特效. 现在国内的电影市场越来越大,做短视频的自媒体也越来越多,在他们的后期视频制作的片花中可以看到很多都在使用绿幕或者蓝幕,这是为什么呢? 首先肯定是为了抠图的方便.将主体部分 ...

最新文章

  1. Ajax实现无刷新树
  2. 【Nginx】面试官:给我讲讲Nginx如何实现四层负载均衡?
  3. stackoverflow上Java相关回答整理翻译
  4. lync 安装后相关防病毒软件的设置
  5. 第4章-机器学习基础
  6. 在线编写php文件,php单文件版在线代码编辑器_php实例
  7. erwin怎么设置编码_Word页码的设置方式
  8. VM虚拟机的三种网络连接模式
  9. python怎么设置为中文-python怎么变成中文版
  10. macbook终端打开jupyter notebook
  11. [学习]18 SMART原则 如何科学的制定计划
  12. One or more errors occurred 报错
  13. access中本年度的四月一日_2014年3月计算机二级ACCESS上机试题及详解十二
  14. JAVA运行内存的设置
  15. 高洛峰ajax分页源码,PHP 分页类 高洛峰 细说PHP
  16. Casbin入选2022 Google编程之夏
  17. Java NIO 框架 Netty 之美:粘包与半包问题
  18. 【漏洞发现-sql注入】有回显注入--sqli-labs
  19. 143.如何个性化推荐系统设计-3
  20. Python编程-爬虫原理与简单实践

热门文章

  1. 掌控板玩板指南1:初识掌控板、扩展板、Mind+编辑器
  2. 【英语四六级】成绩查询时间定了!
  3. shell开启飞行模式_太好用了!原来手机飞行模式还隐藏着这6个功能!很多人都不知道…...
  4. 【算法精练】河内之塔
  5. 两张电梯卡到期时间是哪天?哪种加密方法?
  6. 忘了捕获异常~~~~~~~~`
  7. GBase 8a 加载longblob类型数据的方法
  8. 使用残差网络resnet与WGAN制作一个生成二次元人物头像的GAN(pytorch)
  9. 十分钟简明易懂搞定堆排序算法,附Python源码
  10. shell 单引号 双引号 反引号 嵌套单双引号 看这篇就够了