OpenCV算法精解3--OpenCV中C++矩阵基本运算
代码环境: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++矩阵基本运算相关推荐
- JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
转载自 JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
转载自 JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
转载自 JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...
- 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)
下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...
- 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 ...
- 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...
原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...
- 算法精解一(C语言版)
最近无事 抽出点时间来整理一下算法 希望对自己有进一步的帮助和对学习算法的同行有一些帮助吧! 讲到算法 这个词是很重一个解决问题的途径 无论在什么行业 算法都是很重要的. 不管你是否承认,无论哪 ...
- 算法精解:DAG有向无环图
DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...
- java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- JVM内存管理–GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
最新文章
- linux的fork语句,Linux C/C++——fork()函数基础
- 都客仿站系列教程四:javascript入门
- 清华博导:我有个好学生想放弃科研 去中学当老师
- 判断对象属性值是否为空
- 漫谈新零售:疫情对新零售的十大影响
- Could not resolve host: 'localhost 报错解决办法
- oracle字符查出一位
- python装饰器详解-python装饰器的详细解析
- idea maven列表有问题的
- python 直方图均衡化_彩色图像直方图均衡化Python
- HDOJ 4889 Scary Path Finding Algorithm 颠覆spfa slf优化
- 用java编写中国象棋_如何用Java实现网络中国象棋室(一)
- 工作学习中word及电脑常备小知识(C盘清理、电脑上微信记录清理)
- (转)802.1Q标准中TAG字段简单说明
- 从黑暗到光明,LED照明演变史知多少?内有彩蛋
- java常见正则表达式用法
- AWS免费服务器申请
- SQL Server 2008 R2 完全卸载与重新安装
- Nginx限制最大连接数、请求速率、下载速度
- 【题解报告】ZJNU综合训练(2021.1.26)
热门文章
- IntelliJ IDEA设置代码字体大小
- c语言 directx,【DirectX 8.1官方正式版】
- AWVS 12下载与破解
- 需求分析报告和需求规格说明书有什么区别?
- 单片机C语言的编译模式,手把手教你学单片机的C语言程序设计六编译预处理.pdf...
- 初学“深入浅出MFC”之(一)
- 蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、全国高校计算机能力挑战赛、软考等大学生编程比赛/考试介绍
- 弹出窗口背景透明 css,CSS弹出背景半透明窗口
- 一文了解 操作系统发展史
- pdg转pdf的正确方法!!