【opencv入门教程】13. 矩阵的加减运算

文章选自:

一、函数add、subtract

cpp 复制代码
//加法运算
CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst,
                      InputArray mask = noArray(
                      
//减法运算
CV_EXPORTS_W void subtract(InputArray src1, InputArray src2, OutputArray dst,
                           InputArray mask = noArray(), int dtype = -1);

说明:

  1. 两个相同size和channels的矩阵与矩阵相加时(即上面的第一种情况)可以用操作符+代替,如"cv::add(A1, B1, C1);"等效于"C1 = A1+B1;"
  2. 多通道的矩阵相加时,各个通道分别单独作相加算

二、测试程序

复制代码
以下测试程序包括分别使用2种方式初始化数据,相同数据类型的矩阵与不同数据类型的矩阵比较,矩阵与标量之间的运算
cpp 复制代码
void Samples::MatrixComputation()
{
  //step1. 相同size与channel矩阵加减运算1
  cv::Mat a = Mat::eye(Size(3, 3), CV_32F);
  cv::Mat b = Mat::ones(Size(3, 3), CV_32F);
  //矩阵加法
  cv::Mat c = a + b;
  //矩阵减法
  cv::Mat d = a - b;
  cout << "step1.相同size与channel矩阵加减运算1" << endl;
  cout << "a  = " << endl << a << endl << endl;
  cout << "b  = " << endl << b << endl << endl;
  cout << "c  = " << endl << c << endl << endl;
  cout << "d  = " << endl << d << endl << endl;

  //step2. 相同size与channel矩阵加减运算2
  cout << "step2. 相同size与channel矩阵加减运算2" << endl;
  cv::Mat A2 = (cv::Mat_<uchar>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1);
  cout << "A2中的数据为:\n" << A2 << endl << endl;
  cv::Mat B2 = (cv::Mat_<uchar>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);
  cout << "B2中的数据为:\n" << B2 << endl << endl;
  //矩阵加法
  cv::Mat C2,C21;
  cv::add(A2, B2, C2);
  C21 = A2 + B2;//相同chnnel与size矩阵
  cout << "C2中的数据为:\n" << C2 << endl << endl;
  cout << "C21中的数据为:\n" << C21 << endl << endl;
  //矩阵减法
  cv::Mat D2, D21;
  cv::subtract(A2, B2, D2);
  D21 = A2 - B2;
  cout << "D2中的数据为:\n" << D2 << endl << endl;
  cout << "D21中的数据为:\n" << D21 << endl << endl;

  //step3. 不同数据类型的矩阵加法运算
  cout << "step3. 不同数据类型的矩阵加法运算" << endl;
  cv::Mat A3 = (cv::Mat_<uchar>(2, 3) << 1, 2, 3, 4, 5, 6);
  cout << "A3中的数据为:\n" << A3 << endl << endl;

  cv::Mat B3 = (cv::Mat_<int>(2, 3) << 2, 3, 4, 5, 6, 250);
  cout << "B3中的数据为:\n" << B3 << endl << endl;

  //不同数据类型的矩阵与矩阵相加
  cv::Mat C3;
  cv::InputArray mask1 = cv::noArray();
  cv::add(A3, B3, C3, mask1, CV_16U);//俩个加数数据类型不相同的情况下使用
  //cv::add(AA, BB, CC); //Error,俩个加数数据类型相同的情况下使用
  cout << "C3中的数据为:\n" << C3 << endl << endl;

  //step4. 矩阵与标量加法运算
  cout << "step4. 不同数据类型的矩阵加法运算" << endl;
  cv::Mat A4 = (cv::Mat_<uchar>(2, 3) << 1, 2, 3, 4, 5, 6);
  cout << "A4中的数据为:\n" << A4 << endl << endl;

  uchar b1 = 1;
  int b2 = 2;

  cv::Mat C4, C41;
  cv::InputArray mask2 = cv::noArray();
  cv::add(A4, b1, C4);//两个加数的数据类型相同
  cv::add(A4, b2, C41, mask2, CV_8U);//两个加数的数据类型不同
  cout << "C4中的数据为:\n" << C4 << endl << endl;
  cout << "C41中的数据为:\n" << C41 << endl << endl;
}

三、 测试结果

相关推荐
Giser探索家2 小时前
无人机桥梁巡检:以“空天地”智慧之力守护交通生命线
大数据·人工智能·算法·安全·架构·无人机
不会学习的小白O^O2 小时前
双通道深度学习框架可实现从无人机激光雷达点云中提取橡胶树冠
人工智能·深度学习·无人机
恒点虚拟仿真2 小时前
虚拟仿真实训破局革新:打造无人机飞行专业实践教学新范式
人工智能·无人机·ai教学·虚拟仿真实训·无人机飞行·无人机专业虚拟仿真·无人机飞行虚拟仿真
鲜枣课堂2 小时前
华为最新光通信架构AI-OTN,如何应对AI浪潮?
人工智能·华为·架构
格林威3 小时前
AOI在新能源电池制造领域的应用
人工智能·数码相机·计算机视觉·视觉检测·制造·工业相机
dxnb223 小时前
Datawhale25年10月组队学习:math for AI+Task5解析几何
人工智能·学习
DooTask官方号3 小时前
DooTask 1.3.38 版本更新:MCP 服务器与 AI 工具深度融合,开启任务管理新体验
运维·服务器·人工智能·开源软件·dootask
救救孩子把4 小时前
30-机器学习与大模型开发数学教程-3-4 矩阵的逆与伪逆
线性代数·机器学习·矩阵
Coovally AI模型快速验证5 小时前
OmniNWM:突破自动驾驶世界模型三大瓶颈,全景多模态仿真新标杆(附代码地址)
人工智能·深度学习·机器学习·计算机视觉·自动驾驶·transformer