mat类的mat是matrix,代表矩阵或者数组
Mat(int rows, int cols, int type)
rows代表行数,cols代表列数,type代表通道数和数据类型
先使用成员函数at访问m中的所有值并打印
#include
using namespace cv;
#include
int main(int argc, char *argv[]){
Mat m = (Mat_<int>(3, 2) << 11, 12, 33, 43,51, 16);
for (int r = 0 ; r <m.rows; r++){
for(int c =0 ; c <m.cols; c++){
cout<< m.at<int>(r, c) << ","
}
cout << endl;}
}
最后打印结果是
11, 12,
33, 43,
51, 16,
几种成员函数的使用不作赘述,接下来说矩阵的运算,加法,减法,点乘,点除,乘法
一。矩阵的加法
Mat src1 = (Mat_<uchar>(2, 3) << 23, 123, 90, 100, 250 , 0):
Mat src2 = (Mat_<uchar>(2, 3)<< 125, 150, 60 , 100, 10 , 40);
Mat dst =src1 +src2;
输出
148,255, 150
200, 255, 140
其中把最大的273显示成为了255, 因为uchar类型最大是255,自动截断了
规则就是,相同类型的矩阵,相应位置相加,
对于不同类型的矩阵相加,可以用add函数
Mat dst;
add(scr1, scr2, dst, Mat(), CV_64FC1);
打印结果
148, 255, 150
200, 255, 40
二,矩阵的减法
void subtract(InputArray scr1, InputArray scr2, OutputArray dst,int dtype = -1)
和add()函数类似,只有矩阵类型一致的时候才可以dtype=-1;
三,点乘
矩阵的点乘就是利用矩阵的成员函数mul,而且两个Mat对象的数据类型必须相同才能进行点乘,返回的矩阵的数据类型也不变
Mat dst =scr1.mul(scr2);
这里也可以利用opencv的函数
void multiply(InputArray scr1, InputArray scr2,OutputArray dst, double scale = 1,int dtype = -1)
通过dtype指定输出的数据类型
四,点除运算
点除和点乘类似,都是对应位置的数据做运算,两个Mat的点除,出来也是相同类型的Mat,使用“/”运算符
Mat dst = src2/scr1;
for(int r = 0; r<dst.rows; r++){
for (int c = 0 ; c<dst.clos;c++){
cout << float(dst.at<uchar>(r, c)) <<"," //打印值
}
cout << endl;
}
5, 1, 1,
1, 0 ,0,
最后一个数是40/0,opencv默认分母为0 结果也是0;
五, 矩阵的相乘,这个相乘的运算线代里有,而且对于图像处理里比较少见,就不讨论了。