unity抠人像原理_OpenCV For Unity 实现简单抠图
Opencv的摳圖的思路非常簡單,就是對一個像素點進行判斷,如果是需要剔除的像素,就把該像素的A通道改為0,即變為透明了。
今天就來實現下面這個效果把一個白色的透明通道,摳除的效果。
同樣,要對圖像操作,首先需要對圖片進行讀取,這是非常基本的了。而今天要獲取圖像上的一個像素點,那么就需要用到OpenCVForUnity這個插件中的獲取像素點的方法。int[] get()
他是Mat容器上的實例方法他會返回一個Int數組,如果是JPG,這個數組的長度就是3,分別代表RGB值,如果是PNG,這個數組長度就是RGBA值。
首先我們獲取圖片的Mat,并把尺寸改小增加運行效率。
因為Logo是JPG,所以我們要把這個JPG裝進一個四通道的容器里去。
而且我們知道圖片中白色的RBA 是(255,255,255),而黑色的RBA是(0,0,0)
而我們只要判斷這個像素點是不是等于255就能判斷他是不是白色拉。而Mat.Put則是修改圖片像素的方法,前面是圖片的坐標點,后面跟著RGBA值,并保持原來的值,并把透明通道的值改為0;
但運行結果會發現鋸齒很嚴重,摳不干凈。
而我們也知道圖片的像素其實是做了插值運算的,所以越是鄰近黑色的像素點,并不等于255的。所以我們把他設置一個閾值。
你會發現比剛才干凈很多。
但復雜摳圖可比簡單摳圖要難很多,邏輯也要復雜很多,所以這里只是提供一個思路給大家,如何去改變一個像素值,獲取一個像素值,你可以自己不斷進行新的嘗試。
下面是完整代碼
void Start()
{
//把圖片讀進三通道的容器
var src = Imgcodecs.imread(Application.streamingAssetsPath + "/logo.jpg", 1);
// var mask? = Imgcodecs.imread(Application.streamingAssetsPath+"/testsf.jpg",0);
//把尺寸設置為大小
Imgproc.resize(src, src, new Size(500, 500));
//建立一個四通道的容器
var dst = new Mat(src.cols(), src.rows(), CvType.CV_8UC4);
//轉換色彩空間
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2RGBA);
for (int i = 0; i < dst.cols(); i++)
{
for (int j = 0; j < dst.rows(); j++)
{
//這個105是閾值,你可以自己定義來試試效果
if (dst.get(j, i)[0] >105)
{
dst.put(j, i, 255, 255, 255, 0);
}
}
}
var tex = new Texture2D(dst.cols(), dst.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(dst, tex);
var raw = this.GetComponentInChildren();
raw.texture = tex;
raw.SetNativeSize();
}
總結
以上是生活随笔為你收集整理的unity抠人像原理_OpenCV For Unity 实现简单抠图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: index函数c语言,C语言数据结构中定
- 下一篇: 计算机学猫叫音乐,抖音学猫叫音乐 抖音学