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

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

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

一、向量乘法

这两幅图像说明的就是向量乘法。在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,0)=4;  
    A.at<float>(1,1)=5;  
    A.at<float>(1,2)=6;
    Mat AB = A*B;

二、数量乘法

对于输入的矩阵

数量乘法的结果为

那么可以看出来,这里要求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这种乘法。这种乘法就是直接理解意义上的乘法。对于

乘法的结果为

参考代码

Mat A = Mat(3,3,CV_32FC1,Scalar(0));
    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,0)=4;  
    A.at<float>(1,1)=5;  
    A.at<float>(1,2)=6;
    Mat AB = A*B;
    //
    Mat C = Mat(3,3,CV_32FC1,Scalar(0));
    C = A.clone();
    Mat AC = A.mul(C);

四、小结

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

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

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

来自为知笔记(Wiz)

时间: 2024-10-07 16:36:05

对OpenCV中3种乘法操作的理解掌握的相关文章

opencv中Mat类型数据操作与遍历

Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针. Opencv中对Mat的复制分为两种, Mat A, C; // creates just the header parts A = imread(argv[1], CV_LO

记录php中一种骚操作

$options = array( 'config' => array( 'aaa' => 111, 'bbb' => 222, ), 'headers' => array( 'Content-Type' => 'application/json;charset=utf-8' ), 'params' => array( 'p1' => 'hello', 'p2' => 'world', ), 'signOptions' => array( 'ccc'

opencv中CalcOpticalFlowPyrLK实现的光流法理解

更多细节请查看论文"PyramidalImplementation of the Lucas Kanade Feature Tracker Description of the algorithm"

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

SQL Server中的三种物理连接操作:嵌套循环连接、合并连接、哈希匹配

浅谈SQL Server中的三种物理连接操作 Merge join.Hash join.Nested loop join对比分析 版权声明:本文为博主原创文章,未经博主允许不得转载.

C/C++中几种操作位的方法

参考How do you set, clear and toggle a single bit in C? c/c++中对二进制位的操作包括设置某位为1.清除某位(置为0).开关某位(toggling a bit).检查某位是否为1等.这些操作较为常见并且可以作为其他位运算的基础接口,以下罗列几种方法: 传统方法 设置某位为1 number |= 1 << x; // 设置第x位为1 清除某位 number &= ~(1 << x); // 置第x位为0 开关某位 numb

EntityFramework中几种操作小结

目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. ? 列中加入RowVersion时间戳 ????public class Product????{????????public int Id { get; set; }????????public string Name { get; set; } ????????[Timestamp]????????public Byte[] RowVersion { get; set;

Android OpenCV中的几种基本数据结构

本文的代码基于OpenCV for Android 3.0 矩阵的类型结构 在opencv中,矩阵的类型结构被定义在opencv2/core/cvdef.h中,如下 #define CV_CN_MAX 512 #define CV_CN_SHIFT 3 #define CV_DEPTH_MAX (1 << CV_CN_SHIFT) #define CV_8U 0 #define CV_8S 1 #define CV_16U 2 #define CV_16S 3 #define CV_32S 4

解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。

说明:本文所有算法的涉及到的优化均指在PC上进行的,对于其他构架是否合适未知,请自行试验. Box Filter,最经典的一种领域操作,在无数的场合中都有着广泛的应用,作为一个很基础的函数,其性能的好坏也直接影响着其他相关函数的性能,最典型莫如现在很好的EPF滤波器:GuideFilter.因此其优化的档次和程度是非常重要的,网络上有很多相关的代码和博客对该算法进行讲解和优化,提出了不少O(1)算法,但所谓的0(1)算法也有优劣之分,0(1)只是表示执行时间和某个参数无关,但本身的耗时还是有区别