1. 程式人生 > >OpenCVforUnity中Texture2D格式轉換為OpenCV中的Mat格式——Texture2DToMatExample案例

OpenCVforUnity中Texture2D格式轉換為OpenCV中的Mat格式——Texture2DToMatExample案例

OpenCV for Unity(2.3.2)外掛中的Texture2DToMatExample案例(Unity2018.2.6f1)

位置:OpenCVForUnity\Examples\Basic\Texture2DToMatExample

 

目錄

一、功能概括

二、場景結構

三、主要功能指令碼


 

一、功能概括

該案例中主要展示了Texture2D格式與OpenCV中的Mat格式是如何轉換的。

場景中又一個立方體,貼圖為戴帽子的人這張圖片。


二、場景結構

場景中包括四個物體

Cube 立方體主要用來作為展示對比圖片的容器,改物體包含實現圖形對比的主要指令碼。

Main Camera 攝像機

Canvas UI的畫布,該案例中主要用來放置Back Button,返回案例列表

EventSystem依附Canvas的必須


三、主要功能指令碼

場景中只有Cube物體上有Script,其中TouchController指令碼是控制滑鼠點選控制立方旋轉的,Texture2DToMatExample指令碼是實現主要功能的指令碼。

Utils.setDebugMode (true);

Utils是OpenCV中的工具類,呼叫setDebugMode(bool debugMode, bool throwException = false)方法,該方法主要是設定輸出模式, debugMode =true,OpenCV的錯誤日誌將顯示在Unity編輯器控制檯,如果throwException為true,throw CvException 被Debug.logError替代。

//載入圖片作為Texture2D
Texture2D imgTexture = Resources.Load ("lena") as Texture2D;
//定義Mat格式
Mat imgMat = new Mat (imgTexture.height, imgTexture.width, CvType.CV_8UC4);
//轉換Texture2D為Mat格式
Utils.texture2DToMat (imgTexture, imgMat);

1定義Mat

Mat (int rows, int cols, int type)

rows是Mat的高度,col是Mat的寬度,typeMat的模式,CvType.CV_8UC4是8位無符號四通道帶透明色RGB影象

2Texture2D轉Mat

texture2DToMat (Texture2D texture2D, Mat mat, bool flip = true, int flipCode = 0)

texture2D要轉換的texture2D,mat轉換成的Mat,轉換要求Mat格式的大小需要與Texture2D的寬高一致,Mat物件的型別必須為'CV_8UC4' (RGBA) , 'CV_8UC3' (RGB) or 'CV_8UC1' (GRAY)等模式;texture2D的TextureFormat必須為RGBA32或者ARGB32;flip和flipCode 結合使用控制影象翻轉,當flip=false時,表示不翻轉,flipCode值無效,當flip=false時,flipCode = 0,表示繞著X軸映象翻轉,flipCode = 1,表示繞著Y軸映象翻轉,flipCode = -1,表示繞著X和Y軸都映象翻轉。

flip=false

 

flip=true,flipCode=-1
flip=true,flipCode=0

 

flip=true,flipCode=1

3Mat 轉換Texture2D

//定義Texture來儲存轉換後的Texture2D紋理
Texture2D texture = new Texture2D (imgMat.cols (), imgMat.rows (), TextureFormat.RGBA32, false);
//Mat轉換成Texture格式
Utils.matToTexture2D (imgMat, texture);
//把轉換後的Texture2D貼在物體的mainTexture上
gameObject.GetComponent<Renderer> ().material.mainTexture = texture;

 matToTexture2D (Mat mat, Texture2D texture2D, bool flip = true, int flipCode = 0, bool flipAfter = false, bool updateMipmaps = false, bool makeNoLongerReadable = false)

mat是需要轉換的Mat,texture2D是轉換後的Texture,flip和flipCode是基於X、Y軸的對映,

flipAfter =true,Mat先轉換後翻轉對映

updateMipmaps =true,將重新計算mipmap級別。

makeNoLongerReadable =true,紋理的系統記憶體副本被釋放。


END