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

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 参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值