OpenCV for Unity学习笔记(1)——Mat及灰度化图像

OpenCV for Unity学习笔记(1)——Mat及灰度化图像

2020年11月8日 0 作者 老王

1 Mat是什么

Mat是OpenCV中最重要的类,以后我们与图像相关的操作基本都要用到Mat类。
它是OpenCV中保存图像数据的基本容器。
其可以表示n维的单通道或多通道数组,它可以存储实数/复数的向量和矩阵,单色或彩色图像等。

2 创建Mat对象

如下可以创建一个rows行,cols列的矩阵,类型为type。

Mat mat = new Mat(行数rows, 列数cols, 类型type);

类型

对于类型type,其格式为CV_[bit](U|S|F)C[channels]
即CV_位数+数值类型+C通道数。
bit:
比特数,位数
有 8bit,16bit,32bit,64bit,对应在 Mat 中,每个像素的所占的空间大小。
U|S|F:
U : unsigned int , 无符号整形
S : signed int , 有符号整形
F : float , 单精度浮点型,float类型本身即有符号
这里的有符号、无符号是针对图像二进制编码来讲的
C[channels]
图像的通道数
如CvType.CV_8UC1表示:单通道阵列(C1),8bit无符号整数(U)
CV_8US2表示:2通道阵列,8bit有符号整数
在OpenCV for Unity中对应的脚本为CvType.cs

3 灰度化图像

基本逻辑如下:
1.先加载图片,并根据图片的长宽和格式创建一个Mat对象
2.然后使用OpenCV for Unity的Utils.texture2DToMat方法将图片填充到Mat对象
3.使用Imgproc.cvtColor(颜色空间变换)将该Mat对象变换至灰度后的Mat对象
(ps:颜色空间变化的详细解释可参考这篇文章)
4.最后使用Utils.matToTexture2D将Mat对象转换为Unity3D中的Texture2D

public class Demo_01 : MonoBehaviour
{
    private RawImage m_SrcImage;
    private RawImage m_HsvImage;

    private void Start()
    {
        m_SrcImage = GameObject.Find("Canvas/SrcImage").GetComponent<RawImage>();
        m_HsvImage = GameObject.Find("Canvas/HsvImage").GetComponent<RawImage>();

        //————————————————————————————————————————————————————
        Texture2D srcTex = Resources.Load<Texture2D>("lena");
        Mat mat = new Mat(srcTex.height, srcTex.width, CvType.CV_8UC4);
        Utils.texture2DToMat(srcTex, mat);

        Mat grayMat = new Mat();
        // 核心代码
        Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);
        Texture2D hsvTex = new Texture2D(grayMat.cols(), grayMat.rows(), TextureFormat.RGBA32, false);
        Utils.matToTexture2D(grayMat, hsvTex);
        //————————————————————————————————————————————————————

        m_SrcImage.texture = srcTex;
        m_HsvImage.texture = hsvTex;
    }
}

效果如下:
OpenCV for Unity灰度化图片

5 源码

链接:OpenCV for Unity库
提取码:kxij

6 参考文章