OpenCV3之Mat矩阵操作


OpenCV—基本矩阵操作与示例


矩阵操作

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 src1dst=src2,即 d s t = s r c − 1 ∗ s r c 2 dst=src^{-1}*src2 dst=src1src2

  • 例如:

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,转置src1
    • GEMM_2_T:值2,转置src2
    • GEMM_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=alphasrc1Tsrc2+betasrc3T,等价于𝚍𝚜𝚝=𝚊𝚕𝚙𝚑𝚊⋅𝚜𝚛𝚌𝟷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]
 */
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值