
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;
}
}
效果如下:
5 源码
链接:OpenCV for Unity库
提取码:kxij