OpenCV:三种矩阵乘法


矩阵乘法

在这里插入图片描述
最常见的矩阵乘法运算,OpenCV中是通过重载 乘号* 来的实现的:
在这里插入图片描述

cv::Mat A = cv::Mat::ones(3, 4, CV_64F);
cv::Mat B = cv::Mat::ones(4, 5, CV_64F);
cv::Mat C = A * B;

要求:

  • 内标一样:(m,n) × (n,m) = (m,m)
  • 数据类型只能是 CV_32F(CV_32FC1)、 CV_64F(CV_64FC1)、 CV_32FC2CV_64FC2 四种之一。
    报错如下:

    OpenCV(4.1.2) Error: Assertion failed ((type == (((5) & ((1 << 3) - 1)) + (((1)-1) << 3)) || type == (((6) & ((1 << 3) -
    1)) + (((1)-1) << 3)) || type == (((5) & ((1 << 3) - 1)) + (((2)-1) << 3)) || type == (((6) & ((1 << 3) - 1)) + (((2)-1
    ) << 3)))) in gemm
    即数据类型必须应该是5, 6, 13, 14
    查表对应:Mat矩阵的基本数据类型


矩阵内积

矩阵内积是OpenCV定义的广义的向量内积向量点乘,为了与下文的矩阵点乘区别,这里称为矩阵内积。原理是把整个Mat矩阵 ravel 展开成一个行(列)向量,之后执行向量的点乘运算,要求参与dot运算的两个Mat矩阵的行列数完全一致,结果是一个double类型的标量。
在这里插入图片描述

cv::Mat D = cv::Mat::ones(3, 4, CV_64FC3);
cv::Mat E = cv::Mat::ones(3, 4, CV_64FC3);
double ret = D.dot(E);

要求:

  • 两个矩阵同型:行列数必须一致,而不是元素个数一致
  • 不要求数据类型
  • 多通道时,对各通道的内积求和

矩阵点乘

这里的点乘不同于向量点乘,是指矩阵各元素对应相乘,结果还是矩阵,与MATLAB语法一致。我所遇到的点乘运用就是在CF Tracker上,见博文KCF核心公式与推导
在这里插入图片描述

  • 使用cv::multiply(A, B, ret);
cv::Mat M = cv::Mat::ones(3, 4, CV_64FC1);
cv::Mat N = cv::Mat::ones(3, 4, CV_64FC1);
cv::Mat K;
cv::multiply(M, N, K);
  • 使用Mat.mul()成员函数
cv::Mat M = cv::Mat::ones(3, 4, CV_64FC1);
cv::Mat N = cv::Mat::ones(3, 4, CV_64FC1);
cv::Mat K = M.mul(N)

要求:

  • 两个矩阵同型:行列数必须一致,各元素才能对应相乘
  • 不要求数据类型,但两者应该类型一致
  • 元素乘积可能发生上溢出,保留最大值(封顶)

矩阵相等判断

bool isEqual(cv::Mat& A, cv::Mat& B){
	assert(A.channels() == 1 && B.channels() == 1);
	cv::Mat comp = A != B;
    return cv::countNonZero(comp) == 0;
}
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值