opencv Mat类的介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangpengzp/article/details/87706341

Mat简介

Mat类是我们使用opencv处理图像必定会用到的类。在使用时候我们需要知道:

1、不必手动为其开辟空间

2、不必在不需要时立即释放空间

mat类由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方式、存储地址) 和 一个指向所有像素值的矩阵(根据所选存储方式不同,矩阵可以是不同维数)的指针。矩阵头占用开销很小,主要开销为像素值矩阵。

opencv使用引用计数机制,让每个Mat有自己的信息头,拷贝构造函数只复制消息头和矩阵指针,不复制矩阵。需要赋值的话请用copyTo或者clone如下:

Mat A,C;
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR);// 这里为矩阵开辟空间

Mat B(A); // 使用拷贝构造函数 只复制消息头和矩阵指针;不复制 矩阵
C=A; // 同上

//深拷贝 用copyTo 或者clone
Mat A  = Mat::ones(4,5,CV_32F);

Mat B = A.clone()    //clone 是完全的深拷贝,在内存中申请新的空间,与A独立

Mat C;
A.copyTo(C) //此处的C矩阵大小与A大小不一致,则申请新的内存空间,并完成拷贝,等同于clone()

采用引用计数机制,因此A开辟的矩阵 计数为3,A、B、C任何一个修改矩阵,都会影响其他的对象值。

Mat创建时赋值

1、Scalar

Scalar能表示颜色,是short类型的向量,Scalar(b , g , r , a),当用不到a的时候,则是Scalar(b,g, r), 如下图则创建保存了一张红色的图,CV_8UC3  是8位 unsigned char型,每个像素由3通道组成。

	Mat m(200, 200, CV_8UC3, Scalar(0, 0, 255));
	//cout << m << endl;
	saveImage(m, "test.jpg");

一些数据类型说明:

• CV_8U - 8-bit unsigned integers ( 0..255 )

• CV_8S - 8-bit signed integers ( -128..127 )

• CV_16U - 16-bit unsigned integers ( 0..65535 )

• CV_16S - 16-bit signed integers ( -32768..32767 )

• CV_32S - 32-bit signed integers ( -2147483648..2147483647 )

• CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )

• CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

2、eye(),zeros(),ones()

eye 创建单位矩阵

Mat a = Mat::eye(4,4,CV_32S);
	cout << a << endl;

zeros 创建都为0的矩阵

Mat a = Mat::zeros(4,4,CV_32S);

ones创建都为1的矩阵

Mat a = Mat::ones(4,4,CV_32S);

3 Rect 取现有Mat的区域


	Mat image = imread("images/alpha.png");
	Mat logo0 = imread("images/logo.png");

	imageROI = image(Rect(10, 20, logo.cols, logo.rows));

 Rect的操作 

arear()返回面积

contains(Point) 点是否在rect内

inside(Rect) Rect 是否在rect内

tl()左上角坐标

br()右下坐标

求交集

Rect rect = rect1 & rect2;

求并集

Rect rect = rect1 | rect2;

平移

Rect rectShift = rect + point;

缩放

Rect rectScale = rect + size;

猜你喜欢

转载自blog.csdn.net/zhangpengzp/article/details/87706341