OpenCV—基本矩阵操作与⽰例OpenCV的基本矩阵操作与⽰例
OpenCV中的矩阵操作⾮常重要,本⽂总结了矩阵的创建、初始化以及基本矩阵操作,给出了⽰例代码,主要内容包括:
创建与初始化
矩阵加减法
矩阵乘法
矩阵转置
矩阵求逆
矩阵⾮零元素个数
矩阵均值与标准差
rectangle函数opencv矩阵全局极值及位置
其他矩阵运算函数列表
1. 创建与初始化矩阵
1.1 数据类型
建⽴矩阵必须要指定矩阵存储的数据类型,图像处理中常⽤的⼏种数据类型如下:
// 基本⽅法
cv::Mat a(cv::Size(5,5),CV_8UC1); // 单通道
cv::Mat b = cv::Mat(cv::Size(5,5),CV_8UC3); //3通道每个矩阵元素包含3个uchar值
cout<<"a = "<<endl<<a<<endl<<endl;
cout<<"b = "<<endl<<b<<endl<<endl;
system("pause");
运⾏结果:
3通道矩阵中,⼀个矩阵元素包含3个变量。
1.3 初始化⽅法
上述⽅法不初始化矩阵数据,因此将出现随机值。如果想避免这种情况,可使⽤Mat类的⼏种初始化创建矩阵的⽅法:
// 初始化⽅法
cv::Mat mz = cv::Mat::zeros(cv::Size(5,5),CV_8UC1); // 全零矩阵
cv::Mat mo = cv::Mat::ones(cv::Size(5,5),CV_8UC1); // 全1矩阵
cv::Mat me = cv::Mat::eye(cv::Size(5,5),CV_32FC1); // 对⾓线为1的对⾓矩阵
cout<<"mz = "<<endl<<mz<<endl<<endl;
cout<<"mo = "<<endl<<mo<<endl<<endl;
cout<<"me = "<<endl<<me<<endl<<endl;
运⾏结果:
2. 矩阵运算
2.1 基本概念
OpenCV的Mat类允许所有的矩阵运算。
2.2 矩阵加减法
我们可以使⽤"+"和"-"符号进⾏矩阵加减运算。
cv::Mat a= Mat::eye(Size(3,2), CV_32F);
cv::Mat b= Mat::ones(Size(3,2), CV_32F);
cv::Mat c= a+b;
cv::Mat d= a-b;
2.3 矩阵乘法
使⽤"*"号计算矩阵与标量相乘,矩阵与矩阵相乘(必须满⾜矩阵相乘的⾏列数对应规则)
Mat m1= Mat::eye(2,3, CV_32F); //使⽤cv命名空间可省略cv::前缀,下同
Mat m2= Mat::ones(3,2, CV_32F);
cout<<"m1 = "<<endl<<m1<<endl<<endl;
cout<<"m2 = "<<endl<<m2<<endl<<endl;
// Scalar by matrix
cout << "\nm1.*2 = \n" << m1*2 << endl;
// matrix per element multiplication
cout << "\n(m1+2).*(m1+3) = \n" << (m1+1).mul(m1+3) << endl;
// Matrix multiplication
cout << "\nm1*m2 = \n" << m1*m2 << endl;
2.4 矩阵转置
矩阵转置是将矩阵的⾏与列顺序对调(第i⾏转变为第i列)形成⼀个新的矩阵。OpenCV通过Mat类的t()函数实现。
// 转置
Mat m1= Mat::eye(2,3, CV_32F);
Mat m1t = m1.t();
cout<<"m1 = "<<endl<<m1<<endl<<endl;
cout<<"m1t = "<<endl<<m1t<<endl<<endl;
system("pause");
运⾏结果:
运⾏结果:运⾏结果:
需要说明的是,如果src是多通道图像或多维矩阵,则函数分别计算不同通道的均值与标准差,因此返回值mean和stddev为对应维度的向
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论