본문 바로가기
programming | development/unity

Unity + OpenCVSharp2 - WebcamTexture

by foooo828 2022. 1. 30.

1. OpenCVSharp CvCapture  사용

화면이 뒤집혀서 나오는데 원인은 모르겠음

    public Material mat;
    private Texture2D dstTexture;
    private OpenCVUnity Convert = new OpenCVUnity();
    IplImage dst;
    IplImage capture;

    private CvCapture cvCapture;
    CvSize size = new CvSize(640, 480);

    private void Start()
    {
        cvCapture = CvCapture.FromCamera(0);
        cvCapture.SetCaptureProperty(CaptureProperty.FrameWidth, 640);
        cvCapture.SetCaptureProperty(CaptureProperty.FrameHeight, 480);

        capture = new IplImage(size.Width, size.Height, BitDepth.U8, 3);
        dst = new IplImage(size.Width, size.Height, BitDepth.U8, 3);
        dstTexture = new Texture2D(size.Width, size.Height, TextureFormat.RGB24, false);

    }


    private void Update()
    {
        capture = cvCapture.QueryFrame();
        Cv.CvtColor(capture, dst, ColorConversion.BgrToRgb);       
        dstTexture.LoadRawTextureData(dst.ImageData, size.Width * size.Height * 3);
        dstTexture.Apply();

    }

    private void OnDestroy()
    {
        dst.Dispose();
        capture.Dispose();
    }

 

2. Unity WebcamTexture 사용

이전프레임, 현재프레임 필요할때

    public Material mat;
    WebCamTexture camTexture;
    private Texture2D dstTexture;
    private OpenCVUnity Convert = new OpenCVUnity();
    IplImage prev;
    IplImage curr;
    IplImage dst;

    private CvCapture cvCapture;

    private void Start()
    {
        WebCamDevice device = WebCamTexture.devices[0];
        camTexture = new WebCamTexture(device.name);
        camTexture.Play();

        if (camTexture.didUpdateThisFrame)
        {
            curr = WebcamTex2Ipl(camTexture);
        }
         dstTexture = new Texture2D(camTexture.width, camTexture.height, TextureFormat.RGBA32, false);
    }

    private void Update()
    {
        if (curr != null) prev = curr;
        if (camTexture.didUpdateThisFrame)
        {
            curr = WebcamTex2Ipl(camTexture);

            dst = Convert.OpticalFlowPyrLK(prev, curr);           
            dstTexture.LoadRawTextureData(dst.ImageData, camTexture.width * camTexture.height * 4);
            dstTexture.Apply();
            mat.mainTexture = dstTexture;
        }
    }

    IplImage WebcamTex2Ipl(WebCamTexture wct)
    {
        Color32[] camTex32 = wct.GetPixels32();
        CvSize size = new CvSize(wct.width, wct.height);
        return IplImage.FromPixelData(size, BitDepth.U8, 4, camTex32);
    }


    private void OnDestroy()
    {
        curr.Dispose();
        dst.Dispose();
        prev.Dispose();
    }

'programming | development > unity' 카테고리의 다른 글

Visual Effect Graph Attributes  (0) 2022.02.25
Strip Particle System  (0) 2022.02.23
Unity + OpenCVSharp2 -IplImage를 Texture2D로 변환  (0) 2022.01.29
Unity에서 Firebase쓰기  (0) 2022.01.06
Unity + Realsense  (0) 2021.11.17

댓글