OpenCV

OpenCV+Unity Mat에서 Texture로 변경시 유의점

Dean83 2022. 4. 15. 23:15

OpenCV는 영상 및 이미지 처리를 할때 Mat 이라고 하는 행렬로 이루어져 있다. 

 

따라서 Unity에서 사용하는 Texture는 바로 사용할 수 없고, 상호 변환을 거쳐야 한다. 

 

OpenCVSharp.Unity.MatToTexture 나 TextureToMat 함수를 이용해 상호변환한다.

 

이중, TextureToMat은 괜찮은데 MatToTexture는 유의점이 두가지가 있다. 

 

 

1. 스레드에서 동작시 오류가 발생한다. 
    - 메인 스레드 외에 동작시 오류가 발생한다. 물론 다른동작은 스레드로 돌리고

       이 함수를 호출할때는 Main스레드로 가져올 수 있다. 바로 SynchronizationContext 를 이용하면

       된다. 자세한 사용법은 : https://dean83.tistory.com/41?category=1088148 

 

스레드 사용시 메인스레드 관련 오류발생 수정 (WPF의 dispatcher)

SynchronizationContext를 통해 메인스레드 부분에서 동작하는 UI 항목들 접근 해야한다.     SynchronizationContext m_Context;를 맴버변수로 선언하고, 스크립트 시작시, (예 : Start 함수 등)      ..

dean83.tistory.com

 

2. 메모리 누수를 방지하기 위해 전역변수에 담아줄 필요가 있다.

    - 설명에 보면, 2번째 인자값을 넣지 않으면 계속하여 메모리 할당을 해서 리턴을 한다. 이럴경우 100% 
       outofmemory 오류가 발생하였다. 
    - 전역Texture2D 변수명 = OpenCVSharp.Unity.MatToTexture(Mat변수, 전역Texture2D 변수명);

      이렇게 사용해야 한다. 예) globalTexture2D = OpenCVSharp.Unity.MatToTexture(sourceMat, globalTexture2D) ;