《OpenCV3编程入门》学习笔记5 Core组件进阶(二) ROI区域图像叠加图像混合

news/2025/2/5 22:00:03/

第5章 Core组件进阶

5.2 ROI区域图像叠加&图像混合

5.2.1 感兴趣区域ROI(region of interest)

1.定义ROI区域两种方法:
(1)定义矩形区域Rect:指定矩形左上角坐标和矩形的长和宽
(2)指定感兴趣行或列的范围Range:Range是从起始索引到终止索引的一段连续序列
2. 示例:利用ROI实现图像叠加

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>using namespace cv;
using namespace std;int main()
{Mat srcimage = imread("love.jpg");Mat logoimage = imread("logo.jpg");Mat imageROI;imageROI = srcimage(Rect(100, 150, logoimage.rows, logoimage.cols));//imageROI = srcimage1(Range(150, 150 + logoimage.rows), Range(100, 100 + logoimage.cols));//加载掩膜,直接将插入的像素设置为logo图像的像素值(必须是灰度图)Mat mask = imread("logo.jpg", 0);//将掩膜复制到ROIlogoimage.copyTo(imageROI, mask);namedWindow("<1>利用ROI实现图像叠加示例窗口");imshow("<1>利用ROI实现图像叠加示例窗口", srcimage);waitKey(0);return 0;
}

5.2.2 线性混合操作

1.理论公式:在这里插入图片描述
2.通过在范围0到1之间改变alpha值,来对两幅图像或视频产生时间上的画面叠化效果(即前后页缓慢过渡叠加效果)
3.实现:addWeighted函数

5.2.3 addWeighted函数:计算数组加权和

1.函数原型:void (InputArray src1,double alpha,InputArray src2,double beta,double gamma,OutputArray dst,int dtype=-1);
2.参数说明:第一个数组(常为Mat),数组权重,和第一个数组相同尺寸和通道数的第二个数组,第二个数组权重,加到权重总和上的标量值,输出的数组,输出阵列的可选深度(默认-1,等同于src1.depth)
3.矩阵表达式:dst=src1[I]*alpha+src2[I]*beta+gamma;其中I是多维数组元素的索引值
4.注意:当输出数组深度为CV_32S时,函数不适用,会内存溢出
5.示例:利用cv::addWeighted()函数实现图像线性混合

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>using namespace cv;
using namespace std;int main()
{//【1】定义一些局部变量double alphaValue = 0.5;double betaValue;//【2】定义并读取图像Mat srcImage1 = imread("boy1.jpg");Mat srcImage2 = imread("girl1.jpg");Mat dstImage;if(!srcImage1.data) {printf("读取srcImage1图像错误~!\n"); return false; }if(!srcImage2.data) { printf("读取srcImage2图像错误~!\n"); return false; }//【3】图像混合加权操作betaValue = (1.0 - alphaValue);addWeighted(srcImage2, alphaValue, srcImage1, betaValue, 0.0, dstImage);namedWindow("<1>线性混合示例窗口【原图】", 1);imshow("<1>线性混合示例窗口【原图】", srcImage1);namedWindow("<2>线性混合示例窗口【效果图】", 1);imshow("<2>线性混合示例窗口【效果图】", dstImage);//【4】区域图像加权操作Mat srcImage3 = imread("girl1min.jpg");Mat ImageROI = srcImage1(Rect(100, 100, srcImage3.rows, srcImage3.cols));addWeighted(ImageROI, 0.5, srcImage3, 0.3, 0.0, ImageROI);namedWindow("<3>区域线性混合示例窗口【效果图】", 1);imshow("<3>区域线性混合示例窗口【效果图】", srcImage1);waitKey(0);return 0;
}

http://www.ppmy.cn/news/611422.html

相关文章

cuDNN 功能模块解析

cuDNN 功能模块解析 Abstract 本cuDNN 8.0.4开发人员指南概述了cuDNN功能&#xff0c;如可自定义的数据布局、支持灵活的dimension ordering&#xff0c;striding&#xff0c;4D张量的子区域&#xff0c;这些张量用作其所有例程的输入和输出。这种灵活性可简单集成到任何神经…

google人机验证无法弹窗

感谢阅读 问题处理思路解决方案 问题处理思路 遇到无法访问的非国内资源&#xff0c;就两种合法方式&#xff0c;换国内源和加证书服务器 本人money有限采用第一种 解决方案 首先将插件到谷歌浏览器&#xff0c;其他浏览器没有试过&#xff0c;思路一致。 点我跳转 然后下载…

Java 构造方法与成员方法的区别

学而时习之,温故而知新. 先说下自己怎样区分它们 认定构造方法是&#xff1a;类名与构造方法相同,这个方法就是构造方法, 这个类中除了构造方法以外的方法都是成员方法,原因是在类中除了变量外的基本都是成员方法。 看一个小案例 package me; public class Me {private …

第四周内容

ipv4地址分类 A类地址 &#xff08;1&#xff09;A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。 &#xff08;2&#xff09;A类地址范围&#xff1a;1.0.0.1—126.255.255.254 &#xff08;3&#xff09;A类地址中的私有地址和保留地址&#xff1a; ① 10.X.X.…

《OpenCV3编程入门》学习笔记5 Core组件进阶(三)分离合并颜色通道

第5章 Core组件进阶 5.3 分离&合并颜色通道 5.3.1 通道分离&#xff1a;split()函数 1.作用&#xff1a;将一个多通道数组分离成几个单通道数组&#xff0c;公式&#xff1a; 2.原型&#xff1a;&#xff08;1&#xff09;void split(const Mat& src,Mat* mvbegin);…

Java 成员变量与局部变量

成员变量:在整个类中都有效 局部变量:在方法内定义的变量称为“局部变量”或“临时变量”&#xff0c;方法结束后局部变量占用的内存将被释放 其特点就是只在定义它的方法中有效, package me;public class Book {String name "语文"; // 成员变量public void inf…

使用TensorRT集成推理inference

使用TensorRT集成推理inference 使用TensorRT集成进行推理测试。 使用ResNet50模型对每个GPU进行推理&#xff0c;并对其它模型进行性能比较&#xff0c;最后与其它服务器进行比较测试。 ResNet-50 Inference performance: Throughput vs Batch size 在每个GPU上使用不同的…

Java this 关键字使用

this 引用就是本类的一个对象 理解这句话看下面一段代码 package me; public class Me {String name; //成员变量int age;public Me(String name, int age) { //这里name和age 是构造方法里面的局部变量this.name name; // 把构造方法里面的局部变量赋值给 成员变量 this.a…