• 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);
    
    }
    
    
  • 相关阅读:
    Selector空轮询处理(转载)
    使用SHOW binlog events查看binlog内容
    netty 3.x 实现http server和遇到的坑
    Tomcat7启动分析(三)Digester的使用(转载)
    MySQL · 引擎特性 · 基于InnoDB的物理复制实现(转载)
    InnoDB多版本(MVCC)实现简要分析(转载)
    MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)
    第 4 章 序列和字符串
    BLAST在Windows系统中本地化
    Sublime text3 创建html模板
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860131.html
Copyright © 2020-2023  润新知