본문 바로가기

LiDAR

Unity AR camera 화면 정보 일부분을 추출하기

728x90

Unity에서 ARkit을 활용하여 프로젝트를 진행하기 위해 AR camera를 이용한 휴대폰 화면의 상단 1/3 지점을 추출할 필요가 있었습니다.  
유니티의 기본 카메라가 아니라 AR camera의 정보를 가져오는 것이므로 어떤식으로 가져와야하나 인터넷을 돌아다니던 중 

 tex.ReadPixels(new UnityEngine.Rect(0, height, width, height), 0, 0);

을 사용하면 카메라의 일부분을 추출할 수 있다는 정보를 얻고 실행에 옮겼습니다.

 

처음 완성한 코드는

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCvSharp;
using UnityEngine.UI;

public class opencv : MonoBehaviour
{

    public RawImage img = default;

    void Start()
    {

        int width = Screen.width;
        int height = Screen.height;
        Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
        tex.ReadPixels(new UnityEngine.Rect(0, 0, width, height), 0, 0);
        tex.Apply();

    }

    void Update()
    {
      
    }
}

위와 같습니다. 그러나 결과는

 

rawimage에 검정화면만... 

 

그래서 생각해보니 위 코드를 Update가 아닌 Start에 넣었기에 시작 시 한 번만 화면을 읽으므로

첫화면인 검정화면을 띄울 수 있겠다는 생각을 했습니다.

그래서 코드를 Update 위치로 옮긴 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCvSharp;
using UnityEngine.UI;

public class opencv : MonoBehaviour
{

    public RawImage img = default;

    void Start()
    {
    }

    void Update()
    {
      
        int width = Screen.width;
        int height = Screen.height;
        Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
        tex.ReadPixels(new UnityEngine.Rect(0, 0, width, height), 0, 0);
        tex.Apply();

    }
}

 

위 코드를 사용하니 

 

화면의 영상은 rawimage에 불러오지만 보이는 것과 같이 여러 이미지가 층층이 쌓인 형태로 보이며 대략 3초정도의 실행후에 튕기는 현상이 발생했습니다.

튕기는 현상의 원인은 Update위치에 tex를 선언하여 Update시 tex를 계속 생성했기 때문에 발생한 것이었습니다.

따라서 코드를

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCvSharp;
using UnityEngine.UI;

public class opencv : MonoBehaviour
{
    // 카메라 영상을 받을 위치 지정
    public RawImage img = default;
    // 카메라 영상을 담을 변수 지정
    private Texture2D tex;

    void Start()
    {
        //화면 위치 지정
        int width = Screen.width;
        int height = Screen.height / 3;
        // tex에 화면 정보를 담을 공간 마련 
        tex = new Texture2D(width, height, TextureFormat.RGB24, false);
    }

    void Update()
    {
        int width = Screen.width;
        int height = Screen.height / 3;

        // 상단 1/3 위치의 화면 정보 읽기 
        tex.ReadPixels(new UnityEngine.Rect(0, 2 * height, width, height), 0, 0);
        // 읽은 화면정보를 tex에 담기 
        tex.Apply();

        // tex에 담긴 Texture2D 정보를 img에 넣어 화면에 출력 
        img.texture = tex;
    }
}

 

위의 코드로 변경하니 튕기는 문제는 해결되었습니다.

그러나 아직 풀리지 않은  하나의 문제... 바로 여러 층이 쌓이는 현상입니다.

코드도 바꿔보고 여러 방법을 써봤으나 상황은 바뀌지 않았습니다. 그러다 문뜩 

 

rawimage의 위치 때문인가?

는 생각이 들어 rawimage의 위치를 아래와 같이 바꾸니 제대로된 화면이 출력되었습니다......ㅠㅠ 

rawimage가 상단 1/3 지점에 포함되어 있어 rawimage를 포함한 화면이 지속적으로 update 되는 문제였습니다...

 

상단 1/3 지점을 제대로 출력하는 사진을 마지막으로 글을 마치겠습니다!!!!

 

 

To Be Continued...

'LiDAR' 카테고리의 다른 글

Unity AR iOS LiDAR 활용  (0) 2024.02.26
Unity AR 메모리 누수 현상 잡기  (0) 2024.02.25
Unity AR 딥러닝 사용하기  (2) 2024.02.25
Unity AR camera with iOS LiDAR  (0) 2024.02.24
Unity AR Raycast 사용하기  (2) 2024.02.24