《OpenCV3编程入门》第5章-学习笔记3-2初级ROI图像混合-线性混合操作

举报
王博Kings 发表于 2020/12/30 00:38:17 2020/12/30
【摘要】        公式:dst = src1[I]*alpha+ src2[I]*beta + gamma; void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1); 第一个参数,...

       公式:dst = src1[I]*alpha+ src2[I]*beta + gamma;

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

 

第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。

第五个参数,gamma,一个加到权重总和上的标量值。看上面的式子自然会理解。
第六个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

 注意:其中的I,是多维数组元素的索引值。

        在遇到多通道数组的时候,每个通道都需要独立地进行处理。

        另外需要注意的是,当输出数组的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。

准备两张一样大小的图片:

 


  
  1. //-------------------------------【头文件、命名空间】--------------------------------------
  2. //
  3. //--------------------------------------------------------------------------
  4. #include <opencv2\opencv.hpp>
  5. #include <opencv2\imgproc\imgproc.hpp>
  6. #include <iostream>
  7. using namespace cv;
  8. using namespace std;
  9. //-------------------------------【全局函数声明】--------------------------------------
  10. //
  11. //--------------------------------------------------------------------------
  12. bool LinearBlending();
  13. int main()
  14. {
  15. system("color 5E");
  16. if (LinearBlending())
  17. {
  18. cout << " LinearBlending " << "运行成功!" << endl;
  19. }
  20. waitKey(0);
  21. return 0;
  22. }
  23. //---------------------------------【LinearBlending()函数】-------------------------------------
  24. // 函数名:LinearBlending()
  25. // 描述:利用cv::addWeighted()函数实现图像线性混合
  26. //--------------------------------------------------------------------------------------------
  27. bool LinearBlending()
  28. {
  29. //【0】定义一些局部变量
  30. double alphaValue = 0.5;
  31. double betaValue;
  32. Mat srcImage1, srcImage2, dstImage;
  33. //【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )
  34. srcImage1 = imread("q.jpg");
  35. srcImage2 = imread("p.jpg");
  36. if (!srcImage1.data) { printf("检查,读取srcImage1错误~! \n"); return false; }
  37. if (!srcImage2.data) { printf("检查,读取srcImage2错误~! \n"); return false; }
  38. cout << srcImage1.rows << " srcImage1 row" << endl;
  39. cout << srcImage1.cols << " srcImage1 col" << endl;
  40. cout << srcImage2.rows << " logoImage row" << endl;
  41. cout << srcImage2.cols << " logoImage col" << endl;
  42. //【2】做图像混合加权操作
  43. betaValue = (1.0 - alphaValue);
  44. addWeighted(srcImage1, alphaValue, srcImage2, betaValue, 0.0, dstImage);
  45. //【3】创建并显示原图窗口
  46. namedWindow("<1>线性混合示例窗口【原图】", 1);
  47. imshow("<1>线性混合示例窗口【原图】", srcImage1);
  48. namedWindow("<2>线性混合示例窗口【原图】", 1);
  49. imshow("<2>线性混合示例窗口【原图】", srcImage2);
  50. namedWindow("<3>线性混合示例窗口【效果图】", 1);
  51. imshow("<3>线性混合示例窗口【效果图】", dstImage);
  52. return true;
  53. }

 结果:

混合结果图: 

本文工程代码下载:

OpenCV3-初级图像混合-线性混合操作 

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/84401966

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。