代码环境:Visual studio2017和Anaconda;
参考书籍:张平《OpenCV算法精解》;
编程语言:Python和C++;
Python3基础学习:Python3基础
C++基础学习:C++基础



1.加法运算

// 矩阵运算包括:加法、减法、点乘、点除、乘法等;
// 1.加法运算
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {/*构造两个矩阵:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 1.mat加法// 使用"+",当和超过255会进行截断;Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst = src1 + src2;      // 注意元素200+元素80的结果;结果为255而不是280;// 使用"+",可以将一个数值和一个矩阵相加;float num1 = 200;Mat dst1 = src1 + num1;cout << "src1 + src2 = \n" << dst << endl;cout << "数值和矩阵相加 = \n" << dst1 << endl;     // 输出dst1和src1类型相同;// 使用add函数进行加法// void add(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype = -1)// 使用add函数,输入矩阵数据类型可以不同,输出矩阵数据类型根据情况自行指定;// 当src1和src2相同时,才可以令dtype = -1,否则会报错;Mat dst2;add(src1, src2, dst2, Mat(), CV_64FC1);cout << "使用add函数进行加法:\n" << dst2 << endl;return 0;
}

2.减法运算

// 2.减法运算
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {/*构造两个矩阵:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 2.mat减法// 使用"-",当减法小于0时,进行截断;Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst = src2 - src1;     // 注意相减小于0时的结果;cout << "src2 - src1 = \n" << dst << endl;// 使用subtract函数进行减法// void substract(InputArray src1,InputArray src2,OutputArray dst,InputArray mask = noArray(),int dtype = -1)Mat dst1;subtract(src2, src1, dst1, Mat(), CV_64FC1);cout << "使用add函数进行加法:\n" << dst1 << endl;    // 对比"-"和"substract"的结果;return 0;
}

3.点乘运算

// 3.点乘
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {/*构造两个矩阵:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 3.点乘:两个矩阵对应位置的数值相乘;// mul成员函数:两个Mat对象数据类型相同才能进行点乘,返回矩阵数据类型不变;// mul成员函数结果超过255会进行截断;Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst = src1.mul(src2);cout << "点乘结果:\n" << dst << endl;cout << "-----------------------" << endl;// multiply函数// void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1)// 注:dst = scale * src1 * src2,在点乘结果基础上乘以放缩系数scale;Mat src3 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src4 = (Mat_<float>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst1;multiply(src3, src4, dst1, 1.0, CV_32FC1);for (int r = 0; r < dst1.rows; r++) {for (int c = 0; c < dst1.cols; c++) {cout << dst1.at<float>(r, c) << ",";}cout << endl;}return 0;
}

4.点除运算

// 4.点除
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc, char *argv[]) {// 4.点除Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst1 = src2 / src1;for (int r = 0; r < dst1.rows; r++) {for (int c = 0; c < dst1.cols; c++) {cout << float(dst1.at<uchar>(r, c)) << ",";}cout << endl;}cout << "------------------" << endl;Mat dst2;divide(src2, src1, dst2, 1.0, -1);for (int r = 0; r < dst2.rows; r++) {for (int c = 0; c < dst2.cols; c++) {cout << float(dst2.at<uchar>(r, c)) << ",";}cout << endl;}return 0;
}

5.乘法运算

// 5.乘法运算
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc, char *argv[]) {// 5.矩阵乘法/*src1 = [[1 2 3],[4 5 6]];src2 = [[6 5],[4 3],[2 1]];*/Mat src1 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);Mat src2 = (Mat_<float>(3, 2) << 6, 5, 4, 3, 2, 1);Mat dst1 = src1 * src2;cout << "src1 * src2 = \n" << dst1 << endl;return 0;
}
// 使用gemm实现矩阵乘法// void gemm(InputArray src1,InputArray src2,double alpha,InputArray src3,double beta,OutputArray dst,int flags = 0)// src1:输入类型是CV_32F或CV_64F的单或双通道矩阵;// src2:输入矩阵,类型和src1类型相同;// alpha:src1与src2相乘后的系数;// src3:输入矩阵,类型和src1类型相同;// beta:src3的系数;// dst:输出矩阵;// flags:所取值--0,GEMM_1_T,GEMM_2_T,GEMM_3_T;// flags控制src1、src2、src3是否转置来实现矩阵之间的不同运算// a.dst = alpha * src1 * src2 + beta * src3,flags = 0;// b.dst = alpha * src1^T(src1转置) * src2 + beta * src3,flags = GEMM_1_T;// c.dst = alpha * src1 * src2^T(src2转置) + beta * src3,flags = GEMM_2_T;// d.dst = alpha * src1 * src2 + beta * src3^T(src3转置),flags = GEMM_3_T;
// 使用gemm实现矩阵乘法
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc, char *argv[]) {// 5.矩阵乘法/*src1 = [[1 2 3],[4 5 6]];src2 = [[6 5],[4 3],[2 1]];*/Mat src1 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);Mat src2 = (Mat_<float>(3, 2) << 6, 5, 4, 3, 2, 1);// 使用gemm函数实现乘法Mat dst1;gemm(src1, src2, 1, NULL, 0, dst1, 0);cout << "gemm实现乘法:\n" << dst1 << endl;return 0;
}

OpenCV算法精解3--OpenCV中C++矩阵基本运算相关推荐

  1. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  2. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  3. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  4. 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)

    下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...

  5. opencv python书籍_OpenCV算法精解:基于Python与C++

    目录 1 OpenCV入门 1.1 初识OpenCV 1.1.1 OpenCV的模块简介 1.1.2 OpenCV 2.4.13与3.2版本的区别 1.2 部署OpenCV 1.2.1 在Visual ...

  6. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

    原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...

  7. 算法精解一(C语言版)

    最近无事  抽出点时间来整理一下算法  希望对自己有进一步的帮助和对学习算法的同行有一些帮助吧! 讲到算法  这个词是很重一个解决问题的途径 无论在什么行业 算法都是很重要的. 不管你是否承认,无论哪 ...

  8. 算法精解:DAG有向无环图

    DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...

  9. java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  10. JVM内存管理–GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

最新文章

  1. linux的fork语句,Linux C/C++——fork()函数基础
  2. 都客仿站系列教程四:javascript入门
  3. 清华博导:我有个好学生想放弃科研 去中学当老师
  4. 判断对象属性值是否为空
  5. 漫谈新零售:疫情对新零售的十大影响
  6. Could not resolve host: 'localhost 报错解决办法
  7. oracle字符查出一位
  8. python装饰器详解-python装饰器的详细解析
  9. idea maven列表有问题的
  10. python 直方图均衡化_彩色图像直方图均衡化Python
  11. HDOJ 4889 Scary Path Finding Algorithm 颠覆spfa slf优化
  12. 用java编写中国象棋_如何用Java实现网络中国象棋室(一)
  13. 工作学习中word及电脑常备小知识(C盘清理、电脑上微信记录清理)
  14. (转)802.1Q标准中TAG字段简单说明
  15. 从黑暗到光明,LED照明演变史知多少?内有彩蛋
  16. java常见正则表达式用法
  17. AWS免费服务器申请
  18. SQL Server 2008 R2 完全卸载与重新安装
  19. Nginx限制最大连接数、请求速率、下载速度
  20. 【题解报告】ZJNU综合训练(2021.1.26)

热门文章

  1. IntelliJ IDEA设置代码字体大小
  2. c语言 directx,【DirectX 8.1官方正式版】
  3. AWVS 12下载与破解
  4. 需求分析报告和需求规格说明书有什么区别?
  5. 单片机C语言的编译模式,手把手教你学单片机的C语言程序设计六编译预处理.pdf...
  6. 初学“深入浅出MFC”之(一)
  7. 蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、全国高校计算机能力挑战赛、软考等大学生编程比赛/考试介绍
  8. 弹出窗口背景透明 css,CSS弹出背景半透明窗口
  9. 一文了解 操作系统发展史
  10. pdg转pdf的正确方法!!