Mat对象构成
class CV_EXPORTS Mat
{
public:
/*..很多方法..*/
/*............*/
int flags;/*flags指定图像的颜色空间
flags > 0 3通道的彩色图像
flags = 0 灰度图像
flags < 0 不作改变
*/
int dims; /*数据的维数*/
int rows,cols; /*行和列的数量;数组超过2维时为(-1,-1)*/
uchar *data; /*指向数据*/
int * refcount; /*指针的引用计数器; 阵列指向用户分配的数据时,指针为 NULL
/* 其他成员 */
...
};
Mat常用成员
1、data Mat 对象中的一个指针,指向存放矩阵数据的内存(uchar* data)
2、dims 矩阵的维度,34的矩阵维度为2维,34*5的矩阵维度为3维
3、channels 矩阵通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12
个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。4、depth 深度,即每一个像素的位数,也就是每个通道的位数。
在opencv的Mat.depth()中得到的是一个0 –6的数字,分别代表不同的位:
enum
{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5, CV_64F=6},可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位。
bit_depth
比特数—代表8bite,16bites,32bites,64bites…
CV_8|32|64
如果你现在创建了一个存储–灰度图片的Mat对象,这个图像的大小为宽100,高100
那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位–所以它对应的就是CV_8。
同理,CV_32就是每一个像素点占32bit
S|U|F
S–代表—signed int—有符号整形
U–代表–unsigned int–无符号整形
F–代表–float---------单精度浮点型
C
一张图片的通道数
channels = 1:灰度图片–grayImg—是–单通道图像
channels = 3:RGB彩色图像---------是–3通道图像
channels = 4:带Alph通道的RGB图像–是--4通道图像
如:
CV_8UC3
就是8位无符号三通道的图像
若没有写C几,默认是单通道
如CV_8U = CV_8uC1
Mat对象创建方法
- Mat(int rows, int cols, int _type);
- Mat(Size size,int _type);
imshow显示图像的映射
如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。
如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer,有符号位),便用像素值除以256。也就是说,值的范围是 [0,255 x 256]映射到[0,255]。
如果图像是32位或64位浮点型(32-bit floating-point or 64-bit floating-point),像素值便要乘以255。也就是说,该值的范围是 [0,1]映射到[0,255]。
我的理解:
这些都是图像数据存储的方式,使用imshow显示的时候默认是CV_8显示,于是需要映射。原来16bit的数据用8bit显示,就损失了图像的丰富度。(这就是为什么mac的图像管理比windows优秀)
8bit是0~255,16bit就是两个8bit接起来,即有8bit个8bit数据。
float在内存中占4个字节,也就是32位
如:CV_8U的灰度或BGR图像的颜色分量都在0~255之间。直接imshow可以显示图像。 CV_32F或者CV_64F取值范围为0~1.0,imshow的时候会把图像乘以255后再显示。