图像在opencv中的存储方式
在上图中可以看出,在opencv中采用的是像素值来代表每一个像素三通道颜色的深浅。
Mat对象
Mat对象是在OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。数据部分是像如int、double等数据类型的矩阵。
上图展示的是Mat中可以存储的数据类型格式,分别为:自定义类型、double、float、uchar、unsigned char。为了避免不同设备中的数据有效位数不同而造成相应的问题,opencv中规定了一系列数据类型:
Mat()
Mat (int rows, int cois, int type)
Mat (Size size, int type)
Mat (int rows, int cols, int type,const Scalar &s)
Mat (Size size. int type.const Scalar &s)
Mat (int ndims,const int "sizes, inistype)
Mat (int ndims,const int "sizes,int type.const Scalar &s)
针对Mat对象常用的方法:
void copyTo(Mat mat) //复制一个Mat对象
void convertTo(Mat dst, int type) //切换矩阵的数据类型
Mat clone() //复制一个Mat对象
int channels()
int depth()
bool empty(); //是否为空
uchar* ptr(i=0)
一、利用opencv创建一个图像
1、
det = Mat(src.size(), src.type(), Scalar(127, 0, 255));
这种方法适用定义一个与已知图像大小、数据类型一致的图像。代码含义为:定义一个det,该对象的尺寸大小、数据类型与src图像一直,并且将det的颜色填充为三通道数值为(127, 0, 255)的颜色
2、
det = Mat(Size(120,120), CV_16UC(3), Scalar(127, 0, 255));
//or
det = Mat(120,120, CV_16UC(3), Scalar(127, 0, 255));
这种方式可以自己定义图像的空间尺寸,数据类型,以及对应图像的通道数。代码含义为:定义一个det图像,该图像的空间大小为120*120,数据类型为CV_16U,通道数为3。且颜色填充为三通道数值为(127, 0, 255)的颜色。
3、
det = Mat(src, Range(2,150), Range(1,150));
这种方式可以截取已存在图像上指定的部分。代码含义为:将src图像上第3-149行,2-149列的数据截取下来。
二、Mat类赋值
具体样例如下:
det = Mat::eye(120, 120, CV_16UC(3));
枚举法赋值:
det = (Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
我们可以自己定义图像中每一个位置的像素值数值,如上图所示,我们可以定义一个int类型,空间大小为3*3,数值依次为1,2,3,4,5,6,7,8,9的数据。