文章目录
矩阵操作
1.转置
(1)transpose
原型
void transpose(InputArray src, OutputArray dst);
参数
- src:要转置的矩阵
- dst:转置后的矩阵。可以像下面例子一样不用创建实际空间。
例子
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat src=(Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
cout<<src<<endl;
Mat dst;
transpose(src,dst);
cout<<dst<<endl;
waitKey();
return 0;
}
[1, 2, 3;
4, 5, 6;
7, 8, 9]
[1, 4, 7;
2, 5, 8;
3, 6, 9]
(2)Mat::t()
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat src=(Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
cout<<src<<endl;
Mat dst = src.t();
cout<<dst<<endl;
waitKey();
return 0;
}
2.求逆
(1)Mat::inv()
inputMat.inv()
(2)最小二乘法solve
bool cv::solve(
InputArray src1,
InputArray src2,
OutputArray dst,
int flags = DECOMP_LU
)
-
参数:
CV_LU
:最佳主元选取的高斯消除法CV_SVD
:奇异值分解法 (SVD)
-
功能:
求解 s r c 1 ∗ d s t = s r c 2 src1*dst=src2 src1∗dst=src2,即 d s t = s r c − 1 ∗ s r c 2 dst=src^{-1}*src2 dst=src−1∗src2 -
例如:
solve(src1,1,dst,CV_SVD);
3.加减
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat A(2,3,CV_8UC1,Scalar::all(100));
Mat B(2,3,CV_8UC1,Scalar::all(10));
Mat dst1;
//dst=A-B
subtract(A,B,dst1);
cout<<dst1<<endl;
/*
[ 90, 90, 90;
90, 90, 90]
*/
Mat dst2=A-B;
cout<<dst2<<endl;
/*
[ 90, 90, 90;
90, 90, 90]
*/
return 0;
}
3.广义矩阵乘法(融合转置和系数)gemm
void cv::gemm(
InputArray src1,
InputArray src2,
double alpha,
InputArray src3,
double beta,
OutputArray dst,
int flags = 0
)
参数:
flag
:控制哪个矩阵转置。- 值0:不转置,默认
GEMM_1_T
:值1,转置src1GEMM_2_T
:值2,转置src2GEMM_3_T
:值3,转置src3- 一起使用的方法:
GEMM_1_T | GEMM_2_T
功能:
例如:gemm(src1, src2, alpha, src3, beta, dst, GEMM_1_T + GEMM_3_T)
的意思是
d
s
t
=
a
l
p
h
a
∗
s
r
c
1
T
∗
s
r
c
2
+
b
e
t
a
∗
s
r
c
3
T
dst = alpha*src1^T*src2+beta*src3^T
dst=alpha∗src1T∗src2+beta∗src3T,等价于𝚍𝚜𝚝=𝚊𝚕𝚙𝚑𝚊⋅𝚜𝚛𝚌𝟷T⋅𝚜𝚛𝚌𝟸+𝚋𝚎𝚝𝚊⋅𝚜𝚛𝚌𝟹T
4.单位矩阵化setIdentity
void setIdentity(
cv::InputOutputArray mtx,
const cv::Scalar &s = ((cv::Scalar)(1))
)
参数:
mtx
:输入的矩阵,也将改变后的结果存储在其中s
:对角线上的值,默认1
功能:将一个矩阵变成单位矩阵(不改变行列数),只是将矩阵i=j处的置s
的值,其他地方置0值。
Mat A=Mat(3,4,CV_8UC1,Scalar::all(100));
setIdentity(A);
cout << A << endl;
/**
[ 1, 0, 0, 0;
0, 1, 0, 0;
0, 0, 1, 0]
*/
setIdentity(A,Scalar(2)); // setIdentity(A,Scalar::all(2));
cout << A << endl;
/**
[ 2, 0, 0, 0;
0, 2, 0, 0;
0, 0, 2, 0]
*/