这篇文章是对前面几篇的一个基础知识补充,我的内容是针对零基础的初学者,加上水平有限,因此目录设计的可能有些混乱,但是可以最大限度的保证您能看得懂,代码跑的起来。
请读者多多包含。
1、数据类型
数据类型(图像深度)就是指存储每个像素所用的位数,其实就用类型来表示像素点的值。在Emgu CV中有这么几种:
数据类型 | 值 | 数据类型 | 取值范围 | 对应C#的类型 |
DepthType.Cv8U | 0 | 8 位无符号类型 | 0—255 | Byte |
DepthType.Cv8S | 1 | 8 位有符号类型 | -128—127 | SByte |
DepthType.Cv16U | 2 | 16 位无符号类型 | 0—65535 | UInt16 |
DepthType.Cv16S | 3 | 16 位有符号类型 | -32768—32767 | Int16 |
DepthType.Cv32S | 4 | 32 位整数数据类型 | -2147483648—2147483647 | Int32 |
DepthType.Cv32F | 5 | 32 位浮点数类型 | ±(1.18e-38……3.40e38) | float |
DepthType.Cv64F | 6 | 32 位双精度类型 | ±(2.23e-308……1.79e308) | double |
默认的图像深度就是 DepthType.CV8U,所以看到的图像值就是[0,255]
2、Image和Mat相互转换
这两个都是Emgu CV提供的类,可以相互转换。Mat转换成Image时,写法如下:
Image<Bgr, int> tempImage = dstMat.ToImage<Bgr, int>();
Image转换成Mat时,写法如下:
Mat dstMat = new Mat();
dstMat = dstImage.Mat;
3、ConvertTo()函数
ConvertTo()是把一个Mat变量从一种数据类型转换到另一种数据类型,同时可以带上缩放因子和增量,官方介绍如下:
public void ConvertTo(
IOutputArray m, // 输入图像
DepthType rtype, // 图像深度
double alpha = 1.0, // 尺度变换因子,默认值是1.0。可以把输入图像中的每一个元素都乘以alpha。
double beta = 0.0 // 偏移量,默认值是0。可以把输入图像中的每一个元素都乘以alpha,再加上beta。
)
CvInvoke.Imshow()函数显示图像时,必须是展示的是8位颜色图像,也就是Cv8U或者Cv8S的才可以。Image转换成Mat后,会将Mat变量转换Cv32S,比如下面代码的执行:
因此Image转换成Mat后,需要执行ConvertTo()再转换回Cv8U,保持前后格式的统一。否则肯定会出错,这个之前网上的其它作者们都没有介绍过,是我的原创啊。利用Try、Catch捕捉Imshow()函数显示Image转换的Mat,出错如下:
这个坑在我学习Emgu CV时,很久都没发现原因所在。后来才是偶然间发现的。看看,在教您具体用法的同时,还会教您如何必坑,OK不???
原创不易,请勿抄袭。共同进步,相互学习。