ABOUT ME

-

  • [Unity] 유니티 카메라 (웹캠) 디스플레이 하기
    Unity 2020. 3. 6. 20:59

    유니티에서 카메라의 비디오를 가져와 표시하는 방법에 대해 남겨본다
    노트북의 경우는 내장된 전면 웹캠을, 또 모바일 기기의 경우는 전면이나 후면 카메라를 사용할  있다
    유니티에서 기본적으로 지원하는 WebCamDevice WebCamTexture를 통해 쉽게 구현이 가능하다

    Step 1. 카메라 고르기
    런타임에 사용 가능한 카메라는 WebCamTexture.devices 나열되어 있다
    최근 모바일 기기의 경우 광각렌즈가 추가로 달린 경우가 있어서 2 이상의 카메라를 사용할  있다

    Step 2. WebCamTexture 설정하기 
    WebCamDevice.name 인자로 카메라 화면을 받아올 텍스쳐를 생성한다
    WebCamTexture.requestedFPS 통해 카메라 화면을 갱신할 FPS 설정할  있다

    Step 3. 렌더링 타겟 설정하기 
    텍스쳐를 생성한 후에는 카메라 화면이 표시될 GameObject 지정해 주어야 한다
    대상 GameObject Renderer 컴퍼넌트로 가지고 있어야 한다
    대상 GameObject Renderer mainTexture 위에서 생성한 WebCamTexture 대체한다

    Step 4. 카메라 시작/정지 
    WebCamTexture.Play() 카메라 구동을 시작하고,  
    WebCamTexture.Stop()으로 카메라 구동을 중지할  있다

    Step 5. 자원 해제 
    WebCamTexture 사용이 끝나면 Destroy() 호출로 자원을 반환한다

    Example 
    다음은 상기 설명한 내용을 반영한 전체 코드 예제이다
      - 카메라는 제일 먼저 발견된 후면 카메라를 사용한다.

      - Play 버튼을 눌러 캡처를 시작하고, Stop 버튼으로 캡처를 중지한다. 
    Inspector에서 Play 버튼, Stop 버튼, 그리고 화면이 나올 GameObject를 지정해 주어야 한다!

    using System;
    using UnityEngine;
    using System.Collections;
    
    public class WebcamHandler : MonoBehaviour
    {
        // 카메라 화면을 표시할 게임 오브젝트
        // 주의! 유니티 Inspector에서 지정되어야 함
        // 주의! Renderer 컴퍼넌트를 포함해야 함
        public GameObject objectTarget = null;
    
        // 카메라 입력을 위한 WebCamTexture
        protected WebCamTexture textureWebCam = null;
    
        void Start()
        {
            // 현재 사용 가능한 카메라의 리스트
            WebCamDevice[] devices = WebCamTexture.devices;
    
            // 사용할 카메라를 선택
            // 가장 처음 검색되는 후면 카메라 사용
            int selectedCameraIndex = -1;
            for (int i = 0; i < devices.Length; i++)
            {
                // 사용 가능한 카메라 로그
                Debug.Log("Available Webcam: " + devices[i].name + ((devices[i].isFrontFacing) ? "(Front)" : "(Back)"));
    
                // 후면 카메라인지 체크
                if (devices[i].isFrontFacing == false)
                {
                    // 해당 카메라 선택
                    selectedCameraIndex = i;
                    break;
                }
            }
    
            // WebCamTexture 생성
            if (selectedCameraIndex >= 0)
            {
                // 선택된 카메라에 대한 새로운 WebCamTexture를 생성
                textureWebCam = new WebCamTexture(devices[selectedCameraIndex].name);
    
                // 원하는 FPS를 설정
                if (textureWebCam != null)
                {
                    textureWebCam.requestedFPS = 60;
                }
            }
    
            // objectTarget으로 카메라가 표시되도록 설정
            if (textureWebCam != null)
            {
                // objectTarget에 포함된 Renderer
                Renderer render = objectTarget.GetComponent<Renderer>();
    
                // 해당 Renderer의 mainTexture를 WebCamTexture로 설정
                render.material.mainTexture = textureWebCam;
            }
        }
    
        void OnDestroy()
        {
            // WebCamTexture 리소스 반환
            if (textureWebCam != null)
            {
                textureWebCam.Stop();
                WebCamTexture.Destroy(textureWebCam);
                textureWebCam = null;
            }
        }
    
        // Play 버튼이 눌렸을 때
        // 주의! 유니티 Inspector에서 버튼 연결 필요
        public void OnPlayButtonClick()
        {
            // 카메라 구동 시작
            if (textureWebCam != null)
            {
                textureWebCam.Play();
            }
        }
    
        // Stop 버튼이 눌렸을 때
        // 주의! 유니티 Inspector에서 버튼 연결 필요
        public void OnStopButtonClick()
        {
            // 카메라 구동 정지
            if (textureWebCam != null)
            {
                textureWebCam.Stop();
            }
        }
    }



    Fin.

     

     

    반응형

    댓글

Calvin's Memo