cv::copyTo()

OpenCV 中 cv::copyTo 是用来复制矩阵对象 Mat 的,可以实现直接创建一个副本,且在副本矩阵上的操作不会影响原矩阵。

cv::copyTo() 声明

 /** @brief Copies the matrix to another one.The method copies the matrix data to another matrix. Before copying the data, the method invokes :
@codem.create(this->size(), this->type());
@endcode
so that the destination matrix is reallocated if needed. While m.copyTo(m); works flawlessly, the function does not handle the case of a partial overlap between the source and the destination matrices.When the operation mask is specified, if the Mat::create call shown above reallocates the matrix, the newly allocated matrix is initialized with all zeros before copying the data.
@param m Destination matrix. If it does not have a proper size or type before the operation, it is reallocated.*/
void copyTo( OutputArray m ) const;

同时 cv::copyTo() 被重载了,声明如下:

/** @overload
@param m Destination matrix. If it does not have a proper size or type before the operation, it is reallocated.
@param mask Operation mask of the same size as \*this. Its non-zero elements indicate which matrix elements need to be copied. The mask has to be of type CV_8U and can have 1 or multiple channels.
*/
void copyTo( OutputArray m, InputArray mask ) const;

可以看到重载处注释:第二个参数 mask 的尺寸与原图像相同,它的非零元素表示需要复制的矩阵元素,mask 必须是 CV_8U 类型的,可以有 1 个或多个通道。

测试

下图是两张 1000*1000 的图像

目标是将两张图像叠在一起,同时在第一张图像中的白色圆形区域内复制第二张图像的对应区域,即完成图像融合,形成如下效果。

由于 cv::copyTo 可以复制将 mask 矩阵中的非零元素的位置对应于原图像中该位置的值,从而可以实现图像融合,代码如下:

#include <iostream>
#include <sstream>
#include <fstream>#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>#define background "0_background.png"
#define foreground "HappyFish.jpg"void image_fusion1(cv::Mat& matBackGround, cv::Mat& matForeGround, cv::Mat& matFusion);int main(int argc, char** argv)
{cv::Mat matBackGround;cv::Mat matForeGround;cv::Mat matFusion;image_fusion1(matBackGround, matForeGround, matFusion);return 0;
}void image_fusion1(cv::Mat& matBackGround, cv::Mat& matForeGround, cv::Mat& matFusion)
{matBackGround = cv::imread(cv::samples::findFile(background), cv::IMREAD_COLOR);matForeGround = cv::imread(cv::samples::findFile(foreground), cv::IMREAD_COLOR);//cv::namedWindow("Background", cv::WINDOW_AUTOSIZE);//cv::namedWindow("Foreground", cv::WINDOW_AUTOSIZE);//cv::namedWindow("Image Fusion", cv::WINDOW_AUTOSIZE);matForeGround.copyTo(matFusion, matBackGround);cv::imshow("Background", matBackGround);cv::imshow("Foreground", matForeGround);cv::imshow("Image Fusion", matFusion);cv::imwrite("Image Fusion.png", matFusion);cv::waitKey(0);
}

OpenCV 实战 - 图像融合(cv::copyTo())相关推荐

  1. 基于OpenCV的图像融合

    OpenCV实践-基于OpenCV的图像融合 –<小白学视觉>学习笔记 我们可以尝试多种不同图像组合. 比如可以将两张不同的图片或文本图像与图像组合在一起, 或将彩色背景与圈像组合在一起. ...

  2. python图像融合算法_Python OpenCV 实现图像融合

    原标题:Python OpenCV 实现图像融合 来自:https://www.linuxmi.com/python-opencv-image-blending.html 在本文中,我们将讨论Pyth ...

  3. opencv 4快速入门_基于OpenCV的图像融合

    本期我们将一起学习如何使用OpenCV的进行图像拼接. 01. 目录 python 入门 步骤1 -图像导入 步骤2-调整图像大小 步骤3-融合图像 步骤4-导出结果 02. Python Pytho ...

  4. opencv之图像mat复制copyTo,clone=

    函数原型 Mat clone() const; void copyTo( OutputArray m ) const; void copyTo( OutputArray m, InputArray m ...

  5. OpenCV 进行图像融合拼接

    环境: 运行环境:Win10 x64 OpenCV 版本: 4.5.1 源代码: #include <iostream> #include <vector> #include ...

  6. OpenCV图像处理使用笔记(四)——图像融合

    前言常用 1.在OpenCV中定义了好多函数用来操作图像矩阵,有两个矩阵相加的,相减的,混合的,下面我使用QT加OpenCV演示图像融合这个函数. 2.我的IDE是Qt creator,OpenCV的 ...

  7. 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

  8. 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

  9. [Python图像处理] 五.图像融合、加法运算及图像类型转换

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. 寻找带环的链表的柄长
  2. 理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换
  3. 用css自定义滚动条样式
  4. vs2012下 error4996
  5. Spring源码:AOP转文
  6. 同事说rar压缩有风险,让我用zip压缩文件
  7. IDEA如何删除无用war包
  8. java i= i_java中 i!=i+1?你错了。 | 学步园
  9. 学python前要学c吗_目前python熟练 ,想再学golang 需要先学c吗?
  10. tcpdump + mk-query-digest 分析mysql
  11. 使用keytool 生成证书
  12. 【转】匈牙利命名法则
  13. java解析dcm文件
  14. 关键字synchronized与volatile详解
  15. Inspect的学习笔记
  16. 如何用数据分析的概念制作简单Excel报表?
  17. Flink 消费Kafka的有趣现象:固定时间、固定数量的堆积
  18. 我国逸管家中小企业融资难现状及分析(含开题报告、实践报告)(20180404105041)
  19. 十七、打码平台的使用
  20. HIT-ICS程序人生大作业

热门文章

  1. 测试人生 | 从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了
  2. 浏览器处理网页的过程
  3. 查找排序二叉树的最小值,最大值,Next指针,并逆序打印
  4. php缓存输出压缩,PHP缓冲机制:缓冲控制,压缩http响应数据,缓冲 PHP输出
  5. 上下行速率和带宽的关系
  6. 驾考科目三教学内容及学时分配
  7. 有趣的算法——判断空间中球体和长方体是否相交
  8. codeMirror自定义关键词颜色颜色
  9. PHPExcel 导出excel(xls)
  10. 两层板PCB如何设计的? 三层板的PCB又是如何设计的?