OpenCV之ROI图像叠加和混合
来源:互联网 发布:js正则过滤表情符号 编辑:程序博客网 时间:2024/05/22 05:46
在之前的博客中,有一篇关于如何把局部区域添加到另一幅图像的文章:
http://blog.csdn.net/swj110119/article/details/50957691
现在又看到了关于这方面知识更全面的的内容,现在把他们总结出来,也是对这部分内容的加强理解与巩固。
除了上一篇应用cvSetImageROI函数处理外,还可以通过copyTo( OutputArray m, InputArray mask )函数,即利用掩模mask来实现,原理与cvSetImageROI类似,只是在后者的ROI内容是通过mask的覆盖区域以及mask中的像素值来决定的,即与mask非零值对应的像素被复制。代码如下:
#include<opencv.hpp>#include<highgui.h>using namespace cv;int main(){ Mat beauty = imread("E:\\project\\images\\beauty.jpg"); Mat smallplane = imread("E:\\project\\images\\smallplane.png"); Mat ROI = beauty(Rect(280, 0, smallplane.cols, smallplane.rows)); //设置掩模为ROI区域大小相同 Mat mask = imread("E:\\project\\images\\smallplane.png", 0); smallplane.copyTo(ROI, mask); imshow("beautyAndSmallplane", beauty); waitKey(0); return 0;}
还有一个函数能够实现这种功能,
addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
src1和src2表示两个尺寸和类型相同的两个原图像,dst用来存储处理后的图像,alpha、beta和gamma是相应的线性参数,dtype是图像深度,该函数用数学公式可表示为:
dst = alpha*src1+beta*src2+gamma
#include<opencv.hpp>#include<highgui.h>using namespace cv;int main(){ Mat src1 = imread("E:\\project\\images\\mogu.jpg"); Mat src2 = imread("E:\\project\\images\\rain.jpg"); Mat dst; double alpha = 0.6; addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst); imshow("dst", dst); waitKey(0); return 0;}
结果展示:
如果加载的两幅图像大小不一致,可以通过Rect类设置ROI区域来进行局部图像的融合,核心代码如下:
imageROI = srcImage1(Rect(100, 200, srcImage2.cols, srcImage2.rows)); addWeighted(imageROI, alpha, srcImage2, 1 - alpha, 0.0, imageROI);
对于透明度的手动调节,我们可以结合createTrackbar()实现用户调节。实现如下:
#include<opencv.hpp>#include<highgui.h>using namespace cv;#define WINDOW_NAME "调节透明度"const int g_maxAlphaValue = 100;int g_alphaValueSlider;double g_alphaValue;double g_betaValue;Mat g_srcImage1;Mat g_srcImage2;Mat g_dstImage;//回调函数void on_Trackbar(int g_alphaValueSlider,void*){ //计算addWeighted所需参数 g_alphaValue = (double)g_alphaValueSlider / g_maxAlphaValue; g_betaValue = 1 - g_alphaValue; addWeighted(g_srcImage1, g_alphaValue, g_srcImage2, g_betaValue, 0, g_dstImage); imshow(WINDOW_NAME, g_dstImage);}//调节透明度int main(){ g_srcImage1 = imread("E:\\project\\images\\house.jpg"); g_srcImage2 = imread("E:\\project\\images\\road.jpg"); g_alphaValueSlider = 50; namedWindow(WINDOW_NAME, 1); createTrackbar("Alpha", WINDOW_NAME, &g_alphaValueSlider, g_maxAlphaValue, on_Trackbar); on_Trackbar(g_alphaValueSlider, 0); waitKey(0); return 0;}
素材图片
结果图片:
0 0
- OpenCV之ROI图像叠加和混合
- OpenCV之四 ROI区域图像叠加&初级图像混合
- opencv 图像叠加ROI & 图像混合
- opencv学习笔记ROI区域和图像混合叠加
- opencv学习(八)之ROI区域和图像混合叠加
- Opencv ---- ROI区域图像叠加 & 初级图像混合
- OpenCV ROI区域图像叠加&初级图像混合
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- iOS开发中的推送通知的讲解
- 作业:C++作业4
- 使用ThumbnailUtils类获取视频的缩略图
- Shell 学习笔记
- MacOS登陆win10 时出现”远程桌面无法验证您希望连接的计算机的身份"解决方法
- OpenCV之ROI图像叠加和混合
- dll教程1:如何编写dll,一步一步,全部可行
- 阿里云ecs云服务器安装wdcp控制面板教程(推荐CentOS6.5)
- ASP.NET mvc 在视图中使用@helper封装输出代码
- kafka基本命令
- iOS: 在键盘之上显示一个 View
- Android 项目 UI混乱,Button变大,解决方案
- LeetCode 215. Kth Largest Element in an Array
- C#日期时间格式化