详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果

这篇具有很好参考价值的文章主要介绍了详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数cv::add()用于实现两个Mat类矩阵相加,或者矩阵和标量相加。

函数add()的原型如下:

void cv::add(InputArray src1,
             InputArray src2,
             OutputArray dst,
             InputArray mask = noArray(),
             int dtype = -1)	

前四个参数没什么好说的,这里说下最后一个参数dtype,它用于设置输出矩阵的数据类型,具体情况如下:
The input arrays and the output array can all have the same or different depths.
For example, you can add a 16-bit unsigned array to a 8-bit signed array and store the sum as a 32-bit floating-point array. Depth of the output array is determined by the dtype parameter.
In the second and third cases above, as well as in the first case, when src1.depth() == src2.depth(), dtype can be set to the default -1. In this case, the output array will have the same depth as the input array, be it src1, src2 or both.

上面这段话简单明了,就不翻译了。需要说明的是,当两个相加的矩阵数据类型相同时,参数dtype可以用默认值-1。当两个相加的矩阵数据类型不一致时,是必须要设置输出矩阵的数据类型的,否则程序运行时会报错,比如下面的报错:

OpenCV Error: Bad argument (When the input arrays in add/subtract/multiply/divide functions have different types, the output array type must be explicitly specified) in cv::arithm_op, file C:\builds\master_PackSlave-win32-vc12-shared\opencv\modules\core\src\arithm.cpp, line 2011

详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果

函数cv::add()的运算公式及使用时需要注意的地方,
请参看本博文原文,
本博文原文链接
https://www.hhai.cc/thread-140-1-1.html

接下来,上各种情况的示例代码:

示例代码1(相同数据类型的矩阵与矩阵相加)

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;


int main()
{

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


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


	//相同数据类型的矩阵与矩阵相加
	cv::Mat C1;
	cv::add(A1, B1, C1);
	cout << "C1中的数据为:\n" << C1 << endl << endl;

	return(0);
}

运行结果如下:
详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果
注意:C1中的最后一个元素因为饱和操作,值从256变成了255。

示例代码2(不同数据类型的矩阵与矩阵相加)

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;

int main()
{

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


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


	//不同数据类型的矩阵与矩阵相加
	cv::Mat C1;
	cv::InputArray mask1 = cv::noArray();
	cv::add(A1, B1, C1, mask1, CV_16U);
	cout << "C1中的数据为:\n" << C1 << endl << endl;

	return(0);
}

运行结果如下:
详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果
注意,如果下面这条语句:

cv::add(A1, B1, C1, mask1, CV_16U);

如果写成了下面这样:

cv::add(A1, B1, C1);

则程序在运行时会因为A1与B1的数据类型不一样而报错,如下图所示:
详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果

示例代码3(矩阵与标量相加)

这里给一个单通道图像与标量相加的例子,
要注意,如果图像为多通道,
那么要求标量的数据类型为cv::Scalar,
关于cv::Scalar的详细介绍,
请参见博文:https://www.hhai.cc/thread-144-1-1.html

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;


int main()
{

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


	uchar b1 = 1;
	int b2 = 2;

	cv::Mat C1, C2;
	cv::InputArray mask1 = cv::noArray();
	cv::add(A1, b1, C1);//两个加数的数据类型相同
	cv::add(A1, b2, C2, mask1, CV_8U);//两个加数的数据类型不同
	cout << "C1中的数据为:\n" << C1 << endl << endl;
	cout << "C2中的数据为:\n" << C2 << endl << endl;


	return(0);
}

运行结果如下:
详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果
要注意:
此时当两个加数的数据类型不一致时,函数会自动处理,不会报错,但是为了程序的健壮性和可控性,昊虹君还是建议大家按上面的示例代码把结果数据类型控制好。
比如下面的例子:

函数自动根据数据的情况进行类型转换的示例代码和运行结果如下:

//OpenCV版本:3.0.0
//VS版本:2013

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;


int main()
{

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


	uchar b1 = 1;
	double b2 = 2.3;

	cv::Mat C1, C2;
	cv::add(A1, b1, C1);
	cv::add(A1, b2, C2);
	cout << "C1中的数据为:\n" << C1 << endl << endl;
	cout << "C2中的数据为:\n" << C2 << endl << endl;


	return(0);
}

详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果
上面的这个示例代码的结果是我们预期的,但我们把A1中的元素的数据类型改为uchar型,可能就不是我们想要的结果了:

//OpenCV版本:3.0.0
//VS版本:2013

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;


int main()
{

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

	uchar b1 = 1;
	double b2 = 2.3;

	cv::Mat C1, C2;
	cv::add(A1, b1, C1);
	cv::add(A1, b2, C2);
	cout << "C1中的数据为:\n" << C1 << endl << endl;
	cout << "C2中的数据为:\n" << C2 << endl << endl;


	return(0);
}

运行结果如下:
详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果
按照我们的思维习惯,输出矩阵C2中的数据应该都有小数位,但是事实上却没有,这就是函数自动处理的结果,有些自动处理并不是我们想要的结果,所以我们最好还是手动控制。

示例代码4(带掩码操作的矩阵加法)

示例代码如下:

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;


int main()
{

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

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

	cv::Mat mask1(2, 3, CV_8UC1, cv::Scalar(1));
	mask1.at<uchar>(0, 1) = 0;

	cv::Mat C1;
	cv::add(A1, B1, C1, mask1);
	cout << "C1中的数据为:\n" << C1 << endl << endl;

	return(0);
}

运行结果如下:
详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果
上面的第0行,第1列的元素是没有被掩盖了加法操作的,所以其结果为0。文章来源地址https://www.toymoban.com/news/detail-402427.html

到了这里,关于详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV4】计算对称矩阵特征值和特征向量 cv::eigen() 用法详解和代码示例(c++)

    解析: src:输入矩阵,只能是 CV_32FC1 或 CV_64FC1 类型的方阵(即矩阵转置后还是自己) eigenvalues:输出的特征值组成的向量,数据类型同输入矩阵,排列从大到小 eigenvectors:输出的特征向量组成的矩阵,数据类型同输入矩阵,每一行是一个特征向量,对应相应位置的特征值

    2024年02月13日
    浏览(49)
  • opencv 基础50-图像轮廓学习03-Hu矩函数介绍及示例-cv2.HuMoments()

    Hu 矩(Hu Moments)是由计算机视觉领域的科学家Ming-Kuei Hu于1962年提出的一种图像特征描述方法。这些矩是用于描述图像形状和几何特征的不变特征,具有平移、旋转和尺度不变性,适用于图像识别、匹配和形状分析等任务。 Ming-Kuei Hu在其论文中提出了七个用于形状描述的独特

    2024年02月13日
    浏览(66)
  • 【Opencv】cv::dnn::NMSBoxes()函数详解

    本文通过原理和示例对cv::dnn::NMSBoxes()进行解读,帮助大家理解和使用。 cv::dnn::NMSBoxes是OpenCV库中的一个函数,用于在目标检测中处理多个预测框。在目标检测中,模型可能会为同一个物体生成多个预测框,这时就需要通过非极大值抑制(Non-Maximum Suppression,NMS)来抑制冗余

    2024年02月04日
    浏览(116)
  • Opencv cv2.putText 函数详解

    具体函数如下: 函数源码如下: 对应的参数如下: 参数 具体表述 image 绘制的图像 text 绘制的文本 org 文本在图像中显示的坐标,用元组表示格式为(X坐标,Y坐标) font 文本字体类型,值可以为 FONT_HERSHEY_SIMPLEX 、 FONT_HERSHEY_PLAIN fontScale 字体比例因子乘以font-specific基本大小 c

    2024年02月09日
    浏览(75)
  • python-opencv-cv2.inRange函数()函数详解

    cv2.inRange( hsv, lower_red, upper_red ) 参数 描述 hsv 指的是原图 lower_red 指的是图像中低于这个lower_red的值,图像值变为0(黑) upper_red 指的是图像中高于这个upper_red的值,图像值变为0(黑) lower_red~upper_red 在lower_red~upper_red之间的值变成255(白)

    2024年04月09日
    浏览(41)
  • 画圆操作——OpenCV中cv2.circle函数详解

    画圆操作——OpenCV中cv2.circle函数详解 在计算机视觉领域,图像处理是最基础的操作,而画圆操作又是其中不可或缺的一部分。在OpenCV中,cv2.circle函数可以实现画圆的功能。 下面是cv2.circle函数的基本格式: 其中各参数含义如下: img:要进行画圆操作的图片。 center:圆心坐

    2024年02月09日
    浏览(60)
  • 【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解

    在OpenCV图像加法cv2.add函数详解详细介绍了图像的加法运算。 除了这种加法外,OpenCV还提供了带权重的加法,即两副图像的像素通道值相加时各自按一定的权重比例取值来相加。 假设有2个图像矩阵src1和src2,在两个图像融合时,各自的权重分别为alpha和beta,则二者融合后的目

    2024年02月15日
    浏览(93)
  • python-opencv-cv2.threshold()二值化函数详解

    cv2.threshold( src, thresh, maxval, type[, dst] ) → retval, dst 参数 描述 src 表示的是图片源 thresh 表示的是阈值(起始值) maxval 表示的是最大值 type 表示的是这里划分的时候使用的是方法选择参数 常用值为0(cv2.THRESH_BINARY) 第四个是一个方法选择参数,常用的有: • cv2.THRESH_BINARY(黑

    2024年02月15日
    浏览(41)
  • opencv 连通域操作示例代码记录connectedComponentsWithStats()函数示例

    上面这个代码是MFC程序里面的一个函数,不能够直接运行,但是如果学过MFC相信没有问题完全能够看得懂。 上例当中,count=7(也许可能是count,我写成了cout,也就不改了).说明检测到7个连通域。

    2024年02月06日
    浏览(59)
  • OpenCV项目开发实战--进行人脸变形 原理—并附实例Python/C++代码实现

    文末附基于Python和C++两种方式实现的测试代码下载链接 在本教程中,我们将学习如何使用 OpenCV 将一张脸变成另一张脸。 在我之前的文章中,我介绍了面部关键点检测和Delaunay 三角测量。最好查看这些帖子以更好地理解这篇文章。 图像变形首先在电影 Willow 中广泛使用,使用

    2024年02月09日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包