《OpenCV3学习笔记》1.1 Mat详解 :Mat简述

一、Mat的存储

1、Mat基本上是一个包含两个数据部分的类:矩阵头(包含矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向包含矩阵的矩阵的指针

2、浅拷贝:赋值“=”和copy(),只复制矩阵头和指针,A C有各自的矩阵头,但指针指向同一矩阵,可以改变像素数据。

Mat A,C;                          
A = imread(argv [1],IMREAD_COLOR); 
C=A;//浅拷贝

  深拷贝: clonecopyTo()。建立互不影响的Mat,是真正的复制操作,

Mat F,A;
A=imread(argv [1],IMREAD_COLOR); 
Mat F = A.clone();

Mat G;
A.copyTo(G);

3、存储深度

Mat_<uchar>对应的是CV_8U,Mat_<char>对应的是CV_8S,

Mat_<int>对应的是CV_32S,Mat_<float>对应的是CV_32F,

Mat_<double>对应的是CV_64F

二、 创建Mat对象

1、使用Mat构造函数:

Mat M(2,2,CV_8UC3,Scalar(0,0,255));

行、列都是2;CV_8UC3:8位无符号整数, 3 channel通道。

2、利用create函数

Mat test;
test.create(4,4,CV_8UC2);

3、采用Matlab形式的初始化方式

(1)Mat me = Mat::eye(4,4,CV_64F);
(2)Mat mo = Mat::ones(2,2,CV_32F);
(3)Mat mz = Mat::zeros(3,3,CV_8UC1);

4、使用逗号分隔的初始值设定项或初始化列表

Mat C =(Mat_ <double>(3,3)<< 0,-1,0,-1,5,-1,0,-1,0);

//列表初始化
double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M = Mat(3, 3, CV_64F, m).inv();

5、为现有的Mat对象和cv :: Mat :: clonecv :: Mat :: copyTo创建一个新的头。

Mat RowClone = C.row(1).clone();

6、 使用cv :: randu()函数填充具有随机值的矩阵。

Mat R = Mat(3,2,CV_8UC3);
randu(R,Scalar :: all(0),Scalar :: all(255));

7、要是想创建更高维的矩阵,要写成下面的方式

// create a 100x100x100 8-bit array
int sz[] = {100, 100, 100};
Mat L(3, sz, CV_8U, Scalar::all(0));

实际例子

1、

#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;

int main()
{
	//at获取数据的用法
	Mat I = Mat::eye(4, 4, CV_64F);//CV_64F实际为CV_64FC1,单通道
	I.at<double>(1, 1) = CV_PI;
	cout << "\nI = " << I << ";\n" << endl;
	//输出格式
	Mat r = Mat(10, 3, CV_8UC3);
	randu(r, Scalar::all(0), Scalar::all(255));
	cout << "r (OpenCV默认风格) = " << r << ";" << endl << endl;
	cout << "r (Python风格) = " << format(r, Formatter::FMT_PYTHON) << ";" << endl << endl;
	cout << "r (Numpy风格) = " << format(r, Formatter::FMT_NUMPY) << ";" << endl << endl;
	cout << "r (逗号分隔风格) = " << format(r, Formatter::FMT_CSV) << ";" << endl << endl;
	cout << "r (C语言风格) = " << format(r, Formatter::FMT_C) << ";" << endl << endl;
	//定义二维点、三维点
	Point2f p(6, 2);
	cout << " 【2维点】p = " << p << ";" << endl;
	Point3f p3f(8, 2, 0);
	cout << " 【3维点】p3f = " << p3f << ";" << endl;
	//vector输出展示为Mat(v)
	vector<float> v;
	v.push_back(3); v.push_back(5); v.push_back(7);
	cout << "【基于Mat的vector】shortvec = " << Mat(v) << ";" << endl;
	//存放点的vector
	vector<Point2f> points(20);
	for (size_t i = 0; i < points.size(); i++)
		points[i] = Point2f((float)(i * 5), (float)(i % 7));
	cout << "【二维点向量】points = " << points << ";";

	waitKey(0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/81457198
Mat