Opencv矩阵运算 C++ API

# include <opencv2corecore.hpp>
#include <iostream>
using namespace std;
using namespace cv;
template<class T>
void printMat(Mat matrix)
{
	for (int r = 0; r < matrix.rows; r++)
	{
		for (int c = 0; c < matrix.cols; c++)
		{
			if (typeid(T) == typeid(uchar)) {
				cout << (int)(matrix.at<T>(r, c)) << ",";
			}
			else
			{
				cout << (matrix.at<T>(r, c)) << ",";
			} 
		}
		cout << endl;
	}
	cout << endl;
}
template<class T>
void printMatT(Mat matrix)
{
	for (int r = 0; r < matrix.rows; r++)
	{
		for (int c = 0; c < matrix.cols; c++)
		{
				cout << (matrix.at<T>(r, c)) << ",";
		}
		cout << endl;
	}
	cout << endl;
}


int main()
{
	//## Mat的加法,即矩阵中对应元素相加
	//使用重载操作符 “+”
	//初始化两个两个2*3类型为uchar的矩阵
	Mat src1 = (Mat_<uchar>(2, 3) << 23, 123, 90, 100, 250, 0);
	Mat src2 = (Mat_<uchar>(2, 3) << 125, 150, 60, 100, 10, 40);
	Mat dst = src1 + src2;
	printMat<uchar>(dst);
	//一个数值与Mat也可以相加,相当于Mat中每个数值加上这个数,类型转化为Mat中的数值类型
	float value = 100.00;
	Mat dst1 = value + src1;
	printMat<uchar>(dst1);
	//使用Opencv提供的add函数
	Mat src3 = (Mat_<float>(2, 3) << 125, 150, 60, 100, 10, 40);
	Mat dst3;
	add(src1, src3, dst3, Mat(), CV_64FC1);//最后一个参数dtype默认为-1,这时两个输入矩阵类型必须相同
	printMat<double>(dst3);

	//## Mat的减法
	Mat dst4 = src1 - src2;
	//由于是uchar类型,uchar类型最小值为0,所以负数会被截断变为0 
	printMat<uchar>(src1 - src2);

	//## Mat的点乘运算:两个矩阵对应的数值相乘。使用成员函数mul,矩阵类型必须相同,对大于255的数值做了截断处理
	Mat dst5 = src1.mul(src2);
	printMat<uchar>(dst5);
	//使用multiply
	Mat dst6;
	multiply(src1, src3, dst6, 1, CV_32FC1);
	printMat<float>(dst6);
	
	//## Mat的点除运算:两个矩阵对应的值相除;如果分母为0 则默认为 0,Mat矩阵也可以与数值相除
	Mat dst7 = src2 / src1;
	printMat<uchar>(dst7);
	//使用divide函数,也可以与数值相除
	Mat dst8;
	divide(src2, 10, dst8, 1, CV_32FC1);
	printMat<float>(dst8);

	//## Mat的乘法 利用“*”完成两个矩阵的乘法,两个Mat矩阵只能为float 或者 double型其他会报错
	//创建两个浮点型矩阵
	Mat src4 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
	Mat src5 = (Mat_<float>(3, 2) << 6, 5, 4, 3, 2, 1);
	Mat dst9 = src4 * src5;
	printMat<float>(dst9);
	//双通道矩阵也可以正常相乘,可以将以下两个双通道对象当成复数矩阵,所有的实部为第一通道,所有的虚部为第二通道
	Mat src6 = (Mat_<Vec2f>(2, 1) << Vec2f(1, 2), Vec2f(3, 4));
	Mat src7 = (Mat_<Vec2f>(1, 2) << Vec2f(10, 20), Vec2f(5, 15));
	Mat dst10 = src6 * src7;
	printMatT<Vec2f>(dst10);
	// 还可以通过opencv的gemm函数来实现,只能接受单通道和双通道类型为float或者double的矩阵
	Mat dst11;
	gemm(src6, src7, 1, NULL, 0, dst11, 0);
	printMatT<Vec2f>(dst11);
	
	//## 指数和对数运算:对矩阵中每一个数值进行相应的计算,使用exp与log(e为底)函数,这两个函数输入的数据类型只能是float,和double型
	Mat dst12, dst13;
	exp(src3, dst12);
	printMat<float>(dst12);
	log(src3, dst13);
	printMat<float>(dst13);
	//## 幂指数和开平方运算:使用pow和sqrt函数
	Mat src8 = (Mat_<uchar>(2, 2) << 4, 25, 16, 49);
	Mat dst14;
	pow(src8, 2, dst14);
	printMat<uchar>(dst14);
	Mat src9 = (Mat_<float>(2, 2) << 4, 25, 16, 49);
	sqrt(src9, dst14);
 	printMat<float>(dst14);

}

原文地址:https://www.cnblogs.com/PythonFCG/p/13860131.html