栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OpenCV算法精解3--OpenCV中C++矩阵基本运算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCV算法精解3--OpenCV中C++矩阵基本运算

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



1.加法运算
// 矩阵运算包括:加法、减法、点乘、点除、乘法等;
// 1.加法运算
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	
	// 1.mat加法
	// 使用"+",当和超过255会进行截断;
	Mat src1 = (Mat_(2, 3) << 10, 200, 30, 30, 40, 50);
	Mat src2 = (Mat_(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 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	
	// 2.mat减法
	// 使用"-",当减法小于0时,进行截断;
	Mat src1 = (Mat_(2, 3) << 10, 200, 30, 30, 40, 50);
	Mat src2 = (Mat_(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 
#include 
using namespace std;
using namespace cv;

int main(int argc,char *argv[]) {
	
	// 3.点乘:两个矩阵对应位置的数值相乘;
	// mul成员函数:两个Mat对象数据类型相同才能进行点乘,返回矩阵数据类型不变;
	// mul成员函数结果超过255会进行截断;
	Mat src1 = (Mat_(2, 3) << 10, 200, 30, 30, 40, 50);
	Mat src2 = (Mat_(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_(2, 3) << 10, 200, 30, 30, 40, 50);
	Mat src4 = (Mat_(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(r, c) << ",";
		}
		cout << endl;
	}

	return 0;
}
4.点除运算
// 4.点除
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
	// 4.点除
	Mat src1 = (Mat_(2, 3) << 10, 200, 30, 30, 40, 50);
	Mat src2 = (Mat_(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(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(r, c)) << ",";
		}
		cout << endl;
	}

	return 0;
}
5.乘法运算
// 5.乘法运算
#include 
#include 
using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
	// 5.矩阵乘法
	
	Mat src1 = (Mat_(2, 3) << 1, 2, 3, 4, 5, 6);
	Mat src2 = (Mat_(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 
#include 
using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
	// 5.矩阵乘法
	
	Mat src1 = (Mat_(2, 3) << 1, 2, 3, 4, 5, 6);
	Mat src2 = (Mat_(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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号