最近公司要求做一个抠图程序,作者想到接一个百度AI来实现抠图,做出来之后效果不是太好,然后领导说想要实时抠图,让用户现场体验更好些,没办法,只能推倒重来,然后在网上找个shader,然后自己改改,就实现了。

首先是shader代码

Shader "UniversalChromaKey" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_Sens ("Sensibilidad", Range (0,.9)) = .3_Cutoff ("Recorte", Range (0,.9)) = .2_Color ("Chroma", Color) = (0, 1.0, 0)}SubShader {Tags { "Queue"="Transparent" "RenderType"="Transparent" }LOD 200CGPROGRAM#pragma surface surf Lambert alphasampler2D _MainTex;float _Cutoff;float _Sens;half3 _Color;struct Input {float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o) {half4 c = tex2D (_MainTex, IN.uv_MainTex);o.Emission = c.rgb;float aR = abs(c.r - _Color.r) < _Sens ? abs(c.r - _Color.r) : 1;float aG = abs(c.g - _Color.g) < _Sens ? abs(c.g - _Color.g) : 1;float aB = abs(c.b - _Color.b) < _Sens ? abs(c.b - _Color.b) : 1;                        float a = (aR + aG + aB) / 3; if(a < _Cutoff){o.Alpha = 0;}else{o.Alpha = 1;}}ENDCG}FallBack "Diffuse"
}

控制shader脚本

using UnityEngine;
using System.Collections;
using UnityEngine.UI;public class ShaderControls : MonoBehaviour {float sensS, cutoffS;Color colS;// Use this for initializationvoid Start () {sensS = GetComponent<RawImage>().material.GetFloat("_Sens");cutoffS = GetComponent<RawImage>().material.GetFloat("_Cutoff");colS = GetComponent<RawImage>().material.GetColor("_Color");sens = sensS;cutoff = cutoffS; }// Update is called once per framevoid Update () {}public float sens, cutoff;public string r = "99", g = "205", b ="77";//void OnGUI()//{//    sens = GUI.HorizontalSlider(new Rect(25, 25, 100, 30), sens, 0.0f, 1.0f);//    cutoff = GUI.HorizontalSlider(new Rect(25, 70, 100, 30), cutoff, 0.0f, 1.0f);//    r = GUI.TextField(new Rect(25, 120, 40, 20), r);//    g = GUI.TextField(new Rect(70, 120, 40, 20), g);//    b = GUI.TextField(new Rect(120, 120, 40, 20), b);//    if (GUI.Button(new Rect(25, 160, 100, 30), "Reset"))//    {//        sens = sensS;//        cutoff = cutoffS;//        r = (colS.r * 255f).ToString();//        g = (colS.g * 255f).ToString();//        b = (colS.b * 255f).ToString();//    }//    GetComponent<RawImage>().material.SetFloat("_Sens", sens);//    GetComponent<RawImage>().material.SetFloat("_Cutoff", cutoff);//    try//    {//        Color col = new Color(int.Parse(r) / 255f, int.Parse(g) / 255f, int.Parse(b) / 255f);//        //print (col);//        GetComponent<RawImage>().material.color = col;//    }//    catch (UnityException e)//    {//    }//}
}

控制外部摄像机脚本

using UnityEngine;
using System.Collections;
using UnityEngine.Video;
using UnityEngine.UI;
using System.IO;public class CameraControl : MonoBehaviour {/// <summary>/// 外部摄像头/// </summary>private WebCamTexture webTex;/// <summary>/// UI父物体/// </summary>private Canvas canvas;/// <summary>/// 摄像头映射画面/// </summary>private RawImage Camera_image;private void Start(){canvas = GameObject.Find("Canvas").GetComponent<Canvas>();Camera_image = canvas.transform.Find("Camera_screen").GetComponent<RawImage>();StartCoroutine(CallCamera());}/// <summary>/// 打开摄像头/// </summary>/// <returns></returns>IEnumerator CallCamera(){//等待用户允许访问yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//如果用户允许访问,开始获取图像        if (Application.HasUserAuthorization(UserAuthorization.WebCam)){WebCamDevice[] devices = WebCamTexture.devices;string devicename = devices[0].name;webTex = new WebCamTexture(devicename, Screen.width, Screen.height);Camera_image.texture = webTex;webTex.Play();}}}

控制shader脚本和打开摄像头脚本挂载到一个RawImage上面,shader脚本放在材质球上,然后把材质球也放在RawImage上面,

最后效果

由于绿幕不平和有阴影导致的绿幕没有扣掉(测试用的绿幕),如果现场绿幕是平的,效果会更好,作者把项目工程源文件分享出来了,想要的可以下载,如果有不明白的地方可以加QQ群:636926481(互相交流)。

Demo:https://download.csdn.net/download/qq_39954479/12330999

untiy 实时人像抠图相关推荐

  1. 【Matting】MODNet:实时人像抠图模型-NCNN C++量化部署

    相关链接: [Matting]MODNet:实时人像抠图模型-onnx python部署 [Matting]MODNet:实时人像抠图模型-笔记 [Matting]MODNet:实时人像抠图模型-on ...

  2. 【Matting】MODNet:实时人像抠图模型-笔记

    paper:MODNet: Real-Time Trimap-Free Portrait Matting via Objective Decomposition (AAAI 2022) github: ...

  3. 超强实时人像抠图算法开源,随心所欲背景替换!

    谈到人像抠图想必大家都不陌生.在影视剪辑.直播娱乐.线上教学.视频会议等场景中都有人像分割的身影,它可以帮助用户实时.精准地将人物和背景精准识别出来,实现更精细化的人物美颜.背景虚化替换.弹幕穿人等, ...

  4. RobustVideoMatting实时人像抠图实践

    一.准备工作 Code地址:GitHub - PeterL1n/RobustVideoMatting: Robust Video Matting in PyTorch, TensorFlow, Ten ...

  5. android拍照自动裁剪_新功能上线!智能人像抠图、图片自由裁剪,PPT 还能这么玩?...

    众所周知,不少人买平板都是买前「生产力」,买后某奇艺.其实,要打破这个魔咒,一个 WPS 可能就够了. 安卓平板 WPS 不仅能拥有电脑版般的体验,还针对触屏推出了众多实用且前沿的新功能,帮助你快速提 ...

  6. 一键抠图Portrait Matting人像抠图 (C++和Android源码)

    一键抠图Portrait Matting人像抠图 (C++和Android源码) 目录 一键抠图Portrait Matting人像抠图 (C++和Android源码) 1. 项目介绍: 2. MOD ...

  7. openvino c++推理华盛顿大学BackgroundMattingV2模型人像抠图

    使用openvino c++推理华盛顿大学BackgroundMattingV2模型人像抠图. 基本性能:仅使用CPU可以实现720P实时推理 开源项目:https://github.com/king ...

  8. 视频人像抠图论文阅读

    视频人像抠图论文阅读 1.Prime Sample Attention in Object Detection 2.Mask RCNN 3.Background Matting: The World ...

  9. (十)老照片修复、图像超分、图片提高分辨率、图片高清化、图片清晰化、黑白图片上色、人脸祛斑、美颜、人体瘦身、图像去噪、人像抠图、批量处理、视频提高分辨率、视频逐帧修复

    (十)老照片修复.图像超分.图片提高分辨率.图片高清化.图片清晰化.黑白图片上色.人脸祛斑.美颜.人体瘦身.图像去噪.人像抠图.批量处理.视频提高分辨率.视频逐帧修复 本文的代码的功能是:可以对图片文 ...

最新文章

  1. R语言do.call函数和call函数实战
  2. spring cloud中通过配置文件自定义Ribbon负载均衡策略
  3. linux-RPM安装
  4. git中的暂存区与工作区
  5. Fragment间的通信
  6. Java多线程--synchronized修饰普通方法和修饰静态方法的区别
  7. [翻译] UIImageView-Letters
  8. 与Win8之磁盘活动时间100%斗争心得
  9. 学习编程的条件是什么?
  10. 添加RPMfusion仓库
  11. Python Challenge 过关心得(0)
  12. 计算机软件图标不正常,电脑桌面软件图标显示异常
  13. 【C++】c++修改IE浏览器的Internet选项
  14. Photoshop调出田园照片唯美手绘油画效果
  15. AUTOSAR MCAL CAN Driver 接口函数
  16. python报错warning: install_lib: 'build\lib' does not exist -- no Python modules to install
  17. android 捕获按键,Android捕获home和recent app按键
  18. 【c++】保留两位小数
  19. C# + PHP RSA保密通讯
  20. 是一个新的开始,还是冥冥之中已经在路上。

热门文章

  1. CAD图形的缩放——鸟瞰
  2. js中15位及18位身份证号码的校验
  3. 教育培训app开发迅速成长的原因是?未来趋势如何?
  4. SPOJ 7258 SUBLEX 后缀数组_二分答案_前缀和
  5. 《影响力》第四章:社会认同
  6. 美国SigmasTek泰克蓄电池特点-VRLA蓄电池及其应用
  7. 知识点滴 - VRLA铅酸电池
  8. Skyline6.5系列覆盖三维地理信息产业上下游
  9. [JS]div根据其中内容自适应宽度和高度
  10. R语言临床预测模型:分层构建COX生存回归模型STRATIFIED COX MODEL、KM生存曲线、PH假设检验...