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軸都映象翻轉。
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