티스토리 뷰

반응형

-기준픽셀을 지정하여 캠의 중간 지점 픽셀 컬러값을 int로 변환하여 변화값(deltaThreshhlod)에 따른 true/false 리턴하는 로직 

public class WebCamScript : MonoBehaviour
{
    [SerializeField]
    RawImage[] display;
    WebCamTexture camTexture;

    ManagerScripts managerScripts;

    private int currentIndex = 0;


    /// <summary>
    ///변수
    /// </summary>
    public int defaultPixel = 337; //기준 픽셀값 나중에 수정 가능한 형태로 만들것(화면 찍어서 가져오게하든 뭐하든)
    
    int baseX = 0; // 기준 픽셀 X
    int baseY = 0; // 기준 픽셀 Y
    float deltaThreshold = 40; // 변화값

    private void Awake()
    {
        WebcamStop();
        Init();
    }

    private void Start()
    {
        managerScripts = this.GetComponent<ManagerScripts>();
    }

    void Init()
    {
        if (camTexture != null)
        {
            for (int i = 0; i < display.Length; i++)
                display[i].texture = null;
            camTexture.Stop();
            camTexture = null;
        }

        WebCamDevice device = WebCamTexture.devices[currentIndex];
        camTexture = new WebCamTexture(device.name);

        for (int i = 0; i < display.Length; i++)
            display[i].texture = camTexture;

        Debug.Log(display.Length);
        camTexture.Play();

        //승진 추가(2024-02-19) 픽셀 중간값으로 설정
        baseX = camTexture.width / 2;
        baseY = camTexture.height / 2;
    }

    /// <summary>
    ///캠 켜져있으면 연산
    /// </summary>
    void Update()
    {
        //조건에 플래그 추가해서 쓰셈 isCheckMode 뭐 이런거나 CheckMode이런거 조건으로  if (IsCheckMode&&camTexture.didUpdateThisFrame)
        if (camTexture.didUpdateThisFrame)
        {
            Color32 pixelColor = camTexture.GetPixel(baseX, baseY);
            int pixelValue = ConvertColorToInt(pixelColor);
            IsSignificantChange(pixelValue);
        }
    }

    //단순 int 값으로 변환
    int ConvertColorToInt(Color32 color)
    {
        return color.r + color.g + color.b;
    }

    //픽셀 변화량 조건
    bool IsSignificantChange( int pixelValue)
    {
        //defaultPixel을 기준으로 현재값 변화량 비교
        int delta = Mathf.Abs(pixelValue - defaultPixel);
        Debug.Log(pixelValue);
        Debug.Log($"pixelValue:{pixelValue} defaultPixel:{defaultPixel} deltaThreshlod:{deltaThreshold} delta:{delta}");

        //지정된 변화량보다 크면 True 리턴 나중에 이벤트로 만들어서 쓰면 편함
        if (delta > deltaThreshold)
        {
            Debug.Log("true");
            return true;
        }
        else
        {
            return false;
        }
    }

    void WebcamStop()
    {
        // WebCamTexture 리소스 반환
        if (camTexture != null)
        {
            camTexture.Stop();
            WebCamTexture.Destroy(camTexture);
            camTexture = null;

            managerScripts.Log("webcamTexture exist! now destroy");
        }
    }

    private void OnApplicationQuit()
    {
        WebcamStop();
    }
}

 

#unity #유니티 #c# #webcam

반응형
댓글
반응형