定义和用法:

copyTo这个函数有两种定义方式,分别是:

void copyTo( OutputArray m ) const;

void copyTo( OutputArray m, InputArray mask ) const;

也就是参数可以是一张输出图像,或者一张输出图像和一个掩码图。

那么:

image.copyTo(imageROI);

就是把image这张图复制(copy to)到imageROI上。

image.copyTo(imageROI,mask);

则是不仅把image这张图复制(copy to)到mageROI上,且image对应mask中像素值为0的像素点都不会贴到imageROI上。

值得注意的地方:

1.OutputArray的选择

我在跑参考链接2中的这段代码的时候发现了一个问题,代码如下:

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;int main()
{Mat img1 = imread("baboon.jpg", 0);Mat img2 = imread("linux.jpg", 0);imshow("initial img1", img1);Mat roi = img1(Rect(0, 0, img2.cols, img2.rows));# 分别令像素值为1、0,以及令mask=img2.clone();观察输出结果# Mat mask(roi.rows, roi.cols, roi.depth(), Scalar(0));# Mat mask = img2.clone();img2.copyTo(roi);    # img2 拷贝到 roi中# roi 是 img1的 兴趣区域imshow("logan img2", img2);imshow("after mask img1", img1);waitKey();return 0;
}

img2调用copyTo函数,把img2贴到图像roi上(没使用掩码图),然后这段代码的显示结果如下:

这段代码实现了把logo图(也就是img2)贴到狒狒图(img1)上,不过copyTo函数的参数是roi并不是img1,那roi又是什么呢?代码中是这么定义的:

Mat roi = img1(Rect(0, 0, img2.cols, img2.rows));

可以见得roi是img1图像的一部分,还是从左上角开始,长宽等于img2的一部分。

那么如果我把copyTo这句改成下面这样,结果会是怎么呢?

img2.copyTo(img1);   # 注意:img2会完全覆盖img1

结果如下:

改成这样的话,img2并没有粘贴到img1上,而是img1完完全全拷贝了img2,大小也发生了变换。

为什么呢?

原因是:

  • 1、 copyTo函数的功能其实就是把输入图像完全拷贝到输出图像上,并且将输出图像的大小调整成输入图像的大小。(这段来自于copyTo函数源代码的注释:If it does not have a proper size or type before the operation, it is reallocated.)

  • 2、改之前之所以可以把img2贴到img1上是因为,roi的定义调用了Mat类的赋值运算符,Mat类中的拷贝构造函数和赋值运算符定义的新Mat对象,都属于浅拷贝,即只为新构造的对象创建新的矩阵头,并将矩阵指针指向对其进行赋值或拷贝的Mat对象像素值存储的位置。也就是说,这种形式新定义的Mat对象,它的像素值和旧Mat对象的像素值,其实是一个矩阵的值,所以对新对象的像素值进行修改,旧的对象的像素值也会变化。(解释来源于《OpenCV3编程入门》)因此img2调用copyTo函数将值赋给roi时,img1构造roi中那部分像素值也发生了变化,从而img2贴到了img1上。

2.Mask大小的选择

在跑链接2的代码时,我试着将代码改成了如下这样:

// C++int main()
{Mat img1 = imread("baboon.jpg", 0);Mat img2 = imread("linux.jpg", 0);imshow("initial img1", img1);Mat roi = img1(Rect(0, 0, img2.cols, img2.rows));//分别令像素值为1、0,以及令mask=img2.clone();观察输出结果Mat mask(roi.rows - 10, roi.cols - 10, roi.depth(), Scalar(0));//Mat mask = img2.clone();img2.copyTo(roi,mask);imshow("logan img2", img2);imshow("after mask img1", img1);waitKey();return 0;
}

原来代码中的mask长宽为roi.rows和roi.cols,但是我各减了10,想看看这样会发生什么。

而结果在copyTo这一句抛出了异常:

原因:@param mask Operation mask. Its non-zero elements indicate which matrix elements need to be copied.

也就是说,mask是决定img2哪个像素点需要拷贝,哪个像素点不需要拷贝的,因此它必须和img2大小相同。

OpenCV3. copyTo()函数相关推荐

  1. copyTo函数、随机数产生器 RNG、轮廓的特征矩 Moment、cvGet2D函数

    C++ byte 类型 在头文件 windows.h 中 OpenCV 中,IplImage 所在头文件为 #include<highgui/highgui_c.h> 文章目录 1.cop ...

  2. 【OpenCV】OpenCV函数精讲之 -- copyTo()函数及Mask详解(附代码详解)

    copyTo函数有两种重构方式: 第一种:A.copyTo(B),表示将A矩阵复制到B中 第二种:A.copyTo(B, mask),表示得到一个附加掩膜mask的矩阵B. 第一种方法就不多赘述,这里 ...

  3. opencv中的copyTo函数在opencv-Python中的实现

    Opencv中的copyTo()函数在opencv-Python中的实现 copyTo() 函数有两种方式 第一种:src_Image.copyTo(dst_Image),表示将原图复制到目标图中. ...

  4. opencv中copyTo函数的使用

    我们已经知道的是,使用copyTo函数可以得到一个复制的矩阵. A.copyTo(B); 就可以得到和A一毛一样的矩阵B.当然需要事先声明B.并且两者可以互不相关的做各种操作. copyTo还有一个重 ...

  5. OpenCV的copyTo()函数讲解及应用

    Index 目录索引 写在前面 函数介绍 案例演示 参考文章 写在前面 继前文的setTo()函数讲解后,本文对和该函数用法类似的OpenCV中的copyTo()函数进行讲解. 函数介绍 可以直接在 ...

  6. OpenCV copyTo() 函数实现图片交集

    前言 在项目中,需要实现将两张图片重叠覆盖的部分展示出来.发现OpenCV中的函数copyTo可以完美实现.这里简单总结如下. 一 代码实现 #include <opencv2/opencv.h ...

  7. opencv copyto函数

    copyTo最一般的用法是src.copyTo(dst),将src复制到dst矩阵中. 后面一个参数可以表示复制的部分,如上面的代码src.copyTo( dst, detected_edges); ...

  8. Opencv中copyTo()函数的使用方法

    在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,我们用几个实例来说明它的作用.我们要注意mask的数据类型,必须是CV_ ...

  9. OpenCV copyTo()函数

    文章目录 copyTo() 函数原型 简单示例 mask参数深入探究 copyTo() 函数原型 copyTo这个函数有两种定义方式,分别是: void copyTo( OutputArray m ) ...

最新文章

  1. python编程实例视屏-python爬视频实例
  2. 吴恩达后,其钦点的百度研究院院长林元庆也离职筹备AI创业
  3. updatebyprimarykeyselective返回什么是成功_嫦娥五号发射升空成功!!!
  4. php 爬数据库,php爬虫爬取数据并存储至数据库
  5. CSS Sprite的应用【转】
  6. 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。
  7. WebStorm2018.2 破解 激活
  8. 图——基本的图算法(四)关键路径
  9. python 音频格式转换
  10. 计算机游戏cpu,2021年11代酷睿cpu游戏电脑配置推荐(可装win7系统)
  11. 一段美好的记忆,一份真挚的感情,已经远去......
  12. 简信CRM:CRM科学服务体系,促进企业销售增长
  13. C++模版与特化与偏特化
  14. 拼团小程序源码_拼团软件微信拼团小程序拼团卖水果、让您快速引流
  15. Nginx使用stream模块分流实现端口复用
  16. python语言下划线怎么打_python下划线 | 学步园
  17. sort by age(vector)
  18. 再谈中国的一些文字游戏
  19. Google 提供官方的 adb / fastboot 独立工具包[Win/macOS/Linux]
  20. 外贸新客户怎么管理?

热门文章

  1. Gitlab使用Access Token来clone项目
  2. ITF跆拳道考试内容
  3. HTTP和HTTPS的区别以及介绍讲解
  4. 如何上好计算机应用基础第一课,计算机应用基础(第一课).pptx
  5. semiplannar 什么是,QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka颜色格式
  6. ArcGIS制图:高考人数统计
  7. 【论文阅读】二.Webshell检测方法研究综述
  8. elf 取路径_利用libbfd获取elf可执行文件的section(节)及symbol(符号)信息
  9. three.js动画(Animation)
  10. php的libxml函数