天天看点

对OpenCV中3种乘法操作的理解掌握

参考了《Opencv中Mat矩阵相乘——点乘、dot、mul运算详解 》“http://blog.csdn.net/dcrmg/article/details/52404580”的相关内容。

乘法是线性代数的基本操作,在OpenCV中有三种方法实现了乘法。

一、向量乘法

对OpenCV中3种乘法操作的理解掌握
对OpenCV中3种乘法操作的理解掌握

这两幅图像说明的就是向量乘法。在OpenCV中采用" . "来实现,要求是第一个矩阵的列值等于第二个矩阵的行值。且每个矩阵都是float结构。

    Mat A = Mat(3,3,CV_32FC1,Scalar(0));

    Vec3f v (1,2,3);

    Mat B = Mat(v);

    A.at<float>(0,0)=1;  

    A.at<float>(0,1)=2;  

    A.at<float>(0,2)=3;  

    A.at<float>(1,0)=4;  

    A.at<float>(1,1)=5;  

    A.at<float>(1,2)=6;  

    A.at<float>(1,2)=6;

    Mat AB = A*B;

对OpenCV中3种乘法操作的理解掌握

二、数量乘法

对于输入的矩阵

对OpenCV中3种乘法操作的理解掌握

对OpenCV中3种乘法操作的理解掌握

数量乘法的结果为

对OpenCV中3种乘法操作的理解掌握

那么可以看出来,这里要求a和b的向量结构是一样的,在OpenCV中,如果a和b是多维向量的话,那么首先是将其拉长为一维向量,然后做乘法。

    Mat A=Mat::ones(2,3,CV_8UC1);  

    Mat B=Mat::ones(2,3,CV_8UC1);  

    A.at<uchar>(0,0)=1;  

    A.at<uchar>(0,1)=2;  

    A.at<uchar>(0,2)=3;  

    A.at<uchar>(1,0)=4;  

    A.at<uchar>(1,1)=5;  

    A.at<uchar>(1,2)=6;  

    B.at<uchar>(0,0)=1;  

    B.at<uchar>(0,1)=2;  

    B.at<uchar>(0,2)=3;  

    B.at<uchar>(1,0)=4;  

    B.at<uchar>(1,1)=5;  

    B.at<uchar>(1,2)=6;  

    double AB=A.dot(B);  

三、乘法

最后介绍.mul这种乘法。这种乘法就是直接理解意义上的乘法。对于

对OpenCV中3种乘法操作的理解掌握

乘法的结果为

对OpenCV中3种乘法操作的理解掌握

参考代码

    Mat A = Mat(3,3,CV_32FC1,Scalar(0));

    //

    Mat C = Mat(3,3,CV_32FC1,Scalar(0));

    C = A.clone();

    Mat AC = A.mul(C);

对OpenCV中3种乘法操作的理解掌握

四、小结

1、以上三种函数,都是以Mat作为输入参数和输出结果的;

2、. 这种乘法要求两个矩阵都是float结果,后两者只要求两个矩阵的结果是一样的;

3、可以看到,.这种乘法要求第一个矩阵的行值等于第二个矩阵的列值,而后两种乘法则要求参加运算的两个矩阵结构完全一样。

来自为知笔记(Wiz)

目前方向:图像拼接融合、图像识别

联系方式:[email protected]

继续阅读