Azure Kinect에서 초록색 배경이 없는 검은색 키 같은 거.

2019년 13일째 3D Sensor Advent Calendar 기사입니다.

입문


LIV로 BeatSaber의 MR 애니메이션을 찍을 때 "이거 혼자서도 설치할 수 있지??"이런 생각을 계기로 도전해 봤습니다.
2시간 정도 노력하면 무사히 끝낼 수 있으니 기사를 써보자.

완성된 일


Azure Kinect에는 녹색 배경의 색도 키가 합성된 것이 없습니다pic.twitter.com/SuvWXWhAbf - 그 녀석 @Looking Glass & Azure Kinect(@asidys230)December 13, 2019

환경


Unity 2019.2.11.f

・Azure Kinect(아마존에서 산 것)


단계(대략)


1. 점구름 표시


우리의 멋진 블로그를 참조하세요.

  C#로 시작하는 Azure Kinect 개발 ⑥: Unity+C#에 Point Cloud 표시


이런 느낌이 나올 것 같아요


2. 색도키 무엇


이번 색도 키는 대상이 겹치는 부분을 묘사하지 않기 위해 이루어졌다.

인물을 추출하는 것이 아니라 배경을 제거하는 것이다p>

배경만 표시된 상태에서 점 구름을 복사하여 다음 음영처리기가 적용된 재료로 변경합니다.

복제된 점구름의 PointSize는 조금 더 크고, 배경을 덮는 점구름은 이런 느낌입니다.


나는 착색기 문외한이기 때문에 이 글을 참고했다.

  [Unity 착색기 시작] 객체가 겹치는 부분을 파냅니다.


다음은 점운을 위한 다양한 버전입니다.p>

ColorutoutPoint.shader

Shader "Custom/ColorutoutPoint" {
    Properties{
     _Size("ShaderSize", Float) = 1.000000
     _PointSize("PointSize", Float) = 5.0
     _Color("Color", Color) = (1,1,1,1)

    }
        SubShader{
         Tags {"Queue" = "Geometry-1"}

         Pass {
                        Zwrite On
                        ColorMask 0

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma target 2.0
        #include "UnityCG.cginc"
        #pragma multi_compile_fog
        #define USING_FOG (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2))

        float _Size;
        float _PointSize;

        // uniforms
        // vertex shader input data
        struct appdata {
          float3 pos : POSITION;
          half4 color : COLOR;
          UNITY_VERTEX_INPUT_INSTANCE_ID
        };

        // vertex-to-fragment interpolators
        struct v2f {
          float psize : PSIZE;
          fixed4 color : COLOR0;
          #if USING_FOG
            fixed fog : TEXCOORD0;
          #endif
          float4 pos : SV_POSITION;
          UNITY_VERTEX_OUTPUT_STEREO
        };

        // vertex shader
        v2f vert(appdata IN) {
            IN.pos.xyz = IN.pos.xyz * _Size;

          v2f o;
          UNITY_SETUP_INSTANCE_ID(IN);
          UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
          half4 color = IN.color;
          float3 eyePos = mul(UNITY_MATRIX_MV, float4(IN.pos,1)).xyz;
          half3 viewDir = 0.0;
          o.color = saturate(color);
          // compute texture coordinates
          // fog
          #if USING_FOG
            float fogCoord = length(eyePos.xyz); // radial fog distance
            UNITY_CALC_FOG_FACTOR_RAW(fogCoord);
            o.fog = saturate(unityFogFactor);
          #endif
            // transform position
            o.pos = UnityObjectToClipPos(IN.pos);
            o.psize = _PointSize;
            return o;
          }

        // fragment shader
        fixed4 frag(v2f IN) : SV_Target {
          fixed4 col;
          col = IN.color;
          // fog
          #if USING_FOG
            col.rgb = lerp(unity_FogColor.rgb, col.rgb, IN.fog);
          #endif
          return col;
        }
        ENDCG
         }
    }
}



PointCloud.cs

        //背景除去用メッシュ生成
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (GameObject.Find("CutoutMesh"))
            {
                GameObject obj = GameObject.Find("CutoutMesh");
                Destroy(obj);
            }
            verticesGreenBack = vertices;
            greenBack = new GameObject();
            greenBack.name = "CutoutMesh";
            greenBack.AddComponent<MeshFilter>();
            meshRendererG = greenBack.AddComponent<MeshRenderer>();

            meshG = new Mesh();

            //65535点以上描画する際に下記を記述
            meshG.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;

            //頂点座標と色をmeshに渡す
            meshG.vertices = verticesGreenBack;

            //リストに格納した番号の頂点座標を点として描画
            meshG.SetIndices(indices, MeshTopology.Points, 0);

            //メッシュをこのオブジェクトのMeshFilterに適用
            greenBack.GetComponent<MeshFilter>().mesh = meshG;

            meshRendererG.material = materialG;
        }

        // 削除
        if (Input.GetKey(KeyCode.Backspace))
        {
            GameObject obj = GameObject.Find("CutoutMesh");
            Destroy(obj);
        }


천천히 카메라 앞으로 걸어가다.


사람만 좋은 것 같아요.br/>


さいごに


내일은 takmin의 "kalibr로 카메라/IMU 교정"입니다.p>

좋은 웹페이지 즐겨찾기