[OpenCV研究ノート] 1.マットクラス

1. Matクラスのコンストラクタ

Mat(int rows,int cols,int type);
//rows-行数,cols-列数,type-类型
//数据类型包括CV_8UC(n)、CV_8SC(n)、CV_16SC(n)、CV_16UC(n)、CV_32SC(n)、CV_32FC(n)等,n为通道数,imshow显示类型为CV_8UC1
Mat(Size(int cols,int rows),int type);
//Size第一个元素为列数(宽),第二个为行数(高)
Mat m;
m.create(int rows,int cols,int type);
m.create(Size(int cols,int rows),int type);
//使用Mat中的成员函数create完成Mat对象的构造
//examples:构造2行三列的矩阵
Mat m = Mat(2,3,CV_32FC1);
Mat m = Mat(Size(3,2),CV_32FC1);
Mat o = Mat::ones(2,3,CV_32FC1);//全是1的矩阵
Mat o = Mat::zeros(Size(3,2),CV_32FC1);//全是0的矩阵
Mat m = (Mat_<int>(2,3) << 1,2,3,4,5,6);//矩阵初始化

2.シングルチャンネルマットの基本操作

2.1。シングルチャネルマットの基本情報を取得する

Mat m = (Mat_<int>(2,3) << 1,2,3,4,5,6);
cout << "行数" << m.rows <<endl;
cout << "列数" << m.cols <<endl;
cout << "尺寸" << m.size() <<endl;
cout << "通道数" << m.channels() <<endl;
cout << "面积" << m.total() <<endl;//与通道数无关
cout << "维数" << m.dims <<endl;//单通道二维,多通道三维

2.2。単一チャネルMatオブジェクトの値にアクセスする

//1.使用at
m.at<float>(r,c);//访问对象m第r行第c列的值
m.at<float>(Point(r,c));//访问对象m第r行第c列的值
//Point(c,r)第一个元素为列坐标,第二个元素为行坐标

//2.使用ptr
m.ptr<int>(r);//得到矩阵m第r行行首地址
//examples:访问m中所有值
for(int r=0; r<m.rows; r++)
{
    
    
	const int * ptr = m.ptr<int>(r);//得到矩阵m第r行行首地址
	//打印第r行所有值
	for(int c=0; c<m.cols; c++)
	{
    
    
	cout << ptr[c] <<",";
	}
	cout << endl;
}

//3.使用isContinuous和ptr
if(m.isContinuous())//isContinuous返回值为true,说明行与行间存储连续
{
    
    
	int * ptr = m.ptr<int>(0);//得到矩阵第一个值地址
	for(int n=0; n<m.cols*m.rows; n++)
		cout << ptr[n] <<","
}

//4.step和data:使用较少,不详细了解

3.マルチチャンネルマットの基本操作

3.1。VectorクラスVec

マルチチャネルMatオブジェクトを理解する前に、ベクトルクラスVecを理解する必要があります。

Vec<Typename _Tp,int _cn>;//构造_cn X 1的列向量,数据类型为_Tp
//examples
Vec<int,3> vi(21,32,14);//构造长度为3,int类型,初始化21,32,14的列向量
cout << "访问第0个元素" << vi[0] <<endl;

さらに、OpenCVはベクタークラス宣言にエイリアスを設定しています

typedef Vec<uchar,3> Vec3b;
typedef Vec<int,2> Vec2i;
typedef Vec<float,4> Vec4f;
typedef Vec<double,3> Vec3d;

シングルチャネル行列の各要素は値であり、マルチチャネル行列の各要素はベクトルと見なすことができます。

3.2。マルチチャンネルMatオブジェクトを作成する

Mat(int rows, int cols, CV_32FC(n));
//构造由n个rows X cols二位浮点型数据组成的三维矩阵,n=1为单通道矩阵
//examples:
Mat mm = (Mat_<Vec3f>(2,2) << Vec3f(1,11,21),Vec3f(2,12,31),
								Vec3f(5,18,27)Vec3f(7,15,61);

3.3。マルチチャネルMatオブジェクトの値へのアクセス

//1.使用at
mm.at<Vec3f>(r,c);//获得第r行第c列的元素,即一个Vec3f
列0 列1
行0 [1,11,21] [2、12、31]
ライン1 [5、18、27] [7、15、61]
//2.使用ptr
mm.ptr<Vec3f>(r);//获得第r行首元素地址
//examples:
for(int r=0; r<mm.rows; r++)
{
    
    
	Vec3f* ptr = mm.ptr<Vec3f>(r);//得到行首地址
	for(int c=0; c<mm.cols; c++)
	{
    
    
	cout << ptr[c] <<",";
	}
	cout << endl;
}
//3.使用isContinuous和ptr
//4.step和data
//与上述类似,不再赘述

3.4。チャネルの分離とマージ

  • 個別のチャネル:マルチチャネル行列のすべてのベクトルの最初の値で構成される単一チャネル行列を最初のチャネルとし、すべてのベクトルの2番目の値で構成される単一チャネル行列を2番目のチャネルとする、という具合です。
    mmを例にとると、3つのチャネルは次のとおりです。

ここに画像の説明を挿入

  • チャネルの結合:同じサイズとデータタイプの複数の単一チャネルマトリックスを1つの3次元マトリックスに結合
//使用split函数分离多通道,分离后的单通道矩阵被存放在vector容器中
vector<Mat> planes;
split(mm, planes);
//利用merge函数合并单通道矩阵
void merge(const Mat * mv, size_t count, OutputArray dst)
//examples:
Mat plane0 = (Mat_<int>(2,2) << 1,2,3,4);
Mat plane1 = (Mat_<int>(2,2) << 11,12,13,14);
Mat plane2 = (Mat_<int>(2,2) << 21,22,23,24);//三个单通道矩阵
Mat plane[] = {
    
    plane0, plane1, plane2};//用三个单通道矩阵初始化一个数组
Mat mat;
merge(plane, 3, mat);//合并

おすすめ

転載: blog.csdn.net/weixin_44496838/article/details/102814029