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的成员变量
- m.shape 得到数组的尺寸 (3,4)三行四列
- m.dtype 查看数组的数据类型
3.访问二维ndarray中的值
- m[0,3] 访问第0行第3列的值(与C中的二维数组一致)
- m[2,:]访问第二行的所有数据
- m[:,2]访问第二列的所有数据
- 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]]])
常见的情况
- m[0,:,:] 访问第0个二维数组所有的值
即[1,2,3],[4,5,6] - m[:,0,:]访问所有二维数组的第0行
即[1,2,3],[1,2,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. 初始化
#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的信息
- m.rows 获取矩阵的行数
- m.cols 获取矩阵的列数
- Size size = m.size 获取矩阵的尺寸 [行数x列数]
- m.channels()获取矩阵的通道数(即有几个二维矩阵)
- m.total()获得矩阵的面积(即行数乘以列数)
- 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 版权协议,转载请附上原文出处链接和本声明。