ndarray

1. 构造ndarray对象

(1)构造二维的ndarray(包括行数、列数、和类型,类型有uint8、int32、float64)

  • 代码:
  • import numpy as np
  • z=np.zeros((2,4),np.uint8)
  • 注:np.zeros((行数,列数),类型) zeros为未定义元素补充为0
  • z=np.array([[1,2,3,4],[1,2,3,4]],dtype=np.uint8)
  • 另一种创建二维数组的形式
  • print(z) 打印输出

(2)构造三维的ndarray(三维数组可以理解成多个二维数组(每个元素都是二维数组,有多个元素)例如:2x2x4可以理解为2个 2×4的数组)

  • m两个二维数组构成
  • m=np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])

2.ndarray的成员变量

  1. m.shape 得到数组的尺寸 (3,4)三行四列
  2. m.dtype 查看数组的数据类型

3.访问二维ndarray中的值

  1. m[0,3] 访问第0行第3列的值(与C中的二维数组一致)
  2. m[2,:]访问第二行的所有数据
  3. m[:,2]访问第二列的所有数据
  4. m[0:2,0:2] 访问数组第0行到第1行,第0列到第1列的所有数据即访问子矩阵 注:其中区间为左闭右开区间,例子中的2取不到,所以是0-1而不是0-2。

4.访问三维ndarray中的值

m=np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
常见的情况

  1. m[0,:,:] 访问第0个二维数组所有的值
    即[1,2,3],[4,5,6]
  2. m[:,0,:]访问所有二维数组的第0行
    即[1,2,3],[1,2,3]
  3. m[:,:,0]访问所有二维数组的第0列
    即[1,4],[1,4]

Mat

1.初识Mat

定义

  • Mat(int rows,int cols,int type) rows:行数,cols:列数,type:类型
  • Mat(Size(int cols,int rows),int type) 注:此方法中列在前,行在后

类型

  • 类型可以设置为CV_8UC(n)、CV_8SC(n)等
  • 其中前面的数字代表多少bit
  • 又1byte=8bit,所以32即8字节
    32F是占4字节的float
    64F是占8字节的doule类型
    32S是4字节int类型
    8U是1字节的uchar类型

通道

  • 而C(n)代表通道数 (二维数组数)
    C(1)为单通道即二维数组
    C(n)n>1即多通道,与三维ndarray等价,即多个二维数组

2.构造单通道Mat对象(c++)

Mat中数据的存储

Mat的数值在内存中的存储:

  1. 每一行都是连续存储的
  2. 行与行之间有可能连续也有可能存在存储间隔,若存在间隔,行与行之间的间隔也是相等的。

1. 初始化

#include"opencv2/core/core.hpp"
using namespace cv;
int main(){
//1.方法1
	Mat m=Mat(2,3,CV_32FC(1));
//2.方法2
	Mat n=Mat(Size(3,2),CV_32FC(1));
//3.方法3
	Mat a,b;
	a.create(2,3,CV_32FC1);
//4.方法4
	a.create(Size(3,2),CV_32FC1);
//5.方法5(同理可用Size())
	Mat a = Mat::zeros(2,3,CV_32FC1);
//初始化小型矩阵
	Mat m=(Mat_<int>(2,3)<<1,2,3,4,5,6);
	return 0; 
} 

2. 获取Mat的信息

  1. m.rows 获取矩阵的行数
  2. m.cols 获取矩阵的列数
  3. Size size = m.size 获取矩阵的尺寸 [行数x列数]
  4. m.channels()获取矩阵的通道数(即有几个二维矩阵)
  5. m.total()获得矩阵的面积(即行数乘以列数)
  6. m.dims获取矩阵维度(通道数为1则为2维,多通道则为3维,输出数字2,3)

3. 访问单通道Mat对象中的值

1.利用at访问

  • m.at(r,c); 访问第r行第c列
  • m.at(Point(c,r)) 也就是将行和列的索引变成坐标的形式(x轴y轴的形式)

2.成员函数ptr

const int * ptr = m.ptr®
表示第r行第0列的位置
输出第r行:
for(int c=0;c<m.cols;c++){
count<<ptr[c]<<“,”
}

3.isContinuous+ptr输出

  • isContinuous()是判断每一行是否为连续储存,每一行之间有无存储间隔的,若无间隔则返回true,反之,返回false
  • 输出全部元素:
if(m.isContinuous()){
	//获取第一个元素的值
	int * ptr = m.ptr<int>(0);
	for(int i=0;i<m.rows*m.cols;i++){
		//利用[]来输出所有值
		cout<<ptr[n]<<",";
	}
}

版权声明:本文为qq_47896251原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_47896251/article/details/120384757