很久沒更新Opencv for Unity的系列了消痛,最近剛好項目要用到,所以碰巧就抽時間來寫一篇關于opencv for unity的压语,今天來簡單介紹一下Opencv for unity這個插件中的一個非常有用的幫助類WebCamTextureToMatHelper。
你通過他的名字就能知道他是幫助你來獲取Webcam的畫面押袍,并轉換成我們Opencv中所用的Mat類引颈,有了Mat類那不就可以通過Opencv的方法庫來進行各種處理啦耕皮。
廢話不多說境蜕,下面我們進入正題:
- 添加腳本
第一步就是把這個幫助類,添加進場景中凌停,因為他繼承自Mono汽摹,所以直接可以選擇場景中的任意物體進行添加,可以看到他公有很多變量可以進行設置苦锨,建議就保持默認咯逼泣。
- 編寫腳本
下面寫自己的腳本,隨便建立一個腳本舟舒,比如叫WebCamTest之類的拉庶,那么下面如何打開攝像頭呢,當然我們需要我們的腳本中秃励,首先獲取到這個幫助類WebCamTextureToMatHelper氏仗。
要聲明這個類,也別忘記Opencv的命名空間:
然后你只要調用這個實例的初始化方法皆尔,這個類其實已經在幫你初始化獲取攝像頭的畫面了。
然而你看到這里會問慷蠕,我怎么知道這個幫助類有沒有成功的獲取到攝像頭呢?別人既然是一個完善的幫助類肯定也想到啦食呻,你其實看這個幫助類的面板流炕,他提供了三個回調事件 OnInitialized(初始化成功時), OnDisposed(釋放時),OnErrorOcurred(錯誤發(fā)生時)。
你可以拖對應的方法到上面仅胞,也可以通過自己手寫:
我通過webcamTextureHelper在初始化時注冊了一個回調方法
而這個回調方法就是為獲取畫面做準備:
首先聲明一個RawImage 和 Texture2D的變量每辟;
然后通過幫助類GetMat()方法,這個方法是返回畫面的當前幀干旧,他的類型是Mat,這個Opencv的容器相信大家都很熟悉了渠欺。
我們獲得了Mat變量,就說明我們可以決定了Texture2D類型的webTex的攝像頭貼圖的大小椎眯,把這個貼圖給初始化好挠将,并把RawImage的Texture指定為這張貼圖。(別忘記在你的Unity場景里建立一個RawImage并把他賦值給腳本里的RawImage盅视,不然會報空)
最后就是事實把獲取到的Mat更新給Texture就能事實獲取到了攝像頭的畫面了捐名,這個方法呢,我們放到Update()函數(shù)中執(zhí)行闹击。
為了減少消耗,所以我們做了通過WebCamTextureHelper做了兩個判斷成艘,如果是在運行以及這幀有畫面更新的時候赏半,才去通過幫助類GetMat(),并把Mat轉換為Texture;
然后你在編輯里點運行贺归,看到攝像頭的畫面,大功告成断箫,當然你通過獲取到了攝像頭的Mat,你可以進行各種處理后再轉成Texture,賦值給攝像頭拂酣,這就是我們所說的各種特效啦,你可以舉一反三仲义。
最后貼上我的完整腳本
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UnityUtils.Helper;
using UnityEngine;
using UnityEngine.UI;
public class WebCamTest : MonoBehaviour
{
public WebCamTextureToMatHelper webCamTextureHelper;
private RawImage webImg;
private Texture2D webTex;
// Start is called before the first frame update
void Start()
{
webImg = this.GetComponent<RawImage>();
webCamTextureHelper = this.GetComponent<WebCamTextureToMatHelper>();
webCamTextureHelper.onInitialized.AddListener(OnWebCamInitialize);
webCamTextureHelper.Initialize();
}
private void OnWebCamInitialize()
{
Debug.Log("初始化成功了了");
Mat mat = webCamTextureHelper.GetMat();
webTex = new Texture2D(mat.cols(), mat.rows(), TextureFormat.RGBA32, false);
webImg.texture = webTex;
}
// Update is called once per frame
void Update()
{
if (webCamTextureHelper.IsPlaying() && webCamTextureHelper.DidUpdateThisFrame())
{
Mat rgbaMat = webCamTextureHelper.GetMat();
OpenCVForUnity.UnityUtils.Utils.fastMatToTexture2D(rgbaMat, webTex);
}
}
}