当前位置: 首页 > article >正文

Opencv中的copyto函数

一.OpenCV中copyto函数详解

copyto()是 OpenCV 中用于图像复制和融合的核心函数,支持灵活的数据复制和掩模(Mask)操作,其功能和使用方法如下:

1. 核心功能

基础复制:将源图像(Source Image)的数据复制到目标图像(Destination Image)的指定区域。

掩模操作:结合掩模(Mask)实现条件复制,仅当掩模对应位置为非零值时,源图像的像素才会覆盖目标图像。如图

区域限定:通过定义目标图像的感兴趣区域(ROI),控制复制位置。

2. 函数定义

void copyTo( OutputArray m ) const;   
与
void copyTo( OutputArray m, InputArray mask ) const;

第一种是参数可以是一张输出图像

第二种一张输出图像和一个掩码图

image.copyTo(imageROI),把image这张图复制到imageROI上

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

3.叠加的实现

介绍了copyto()函数,知道了他的作用,但是图片的叠加只有一个copyto()函数是无法实现的。例如我们可以用copyto()函数把一张图片叠加到另一张图片上面,但是叠加到哪里我们是不知道的,叠加的区域大小我们也是不知道的。这就需要使用另一个函数去划分感兴趣区域(ROI)

Rect(int x, int y, int width, int height);

参数含义:

Rect(左上角x坐标  ,  左上角y坐标,矩形的宽,矩形的高)

用图像只管感受就是如下图

二.典型使用案列

1.logo叠加

Mat background = imread("background.jpg"); 
Mat logo = imread("logo.png");

// 在背景图的(10,20)位置开辟ROI
Mat roi = background(Rect(10, 20, logo.cols, logo.rows)); 

// 带透明通道的掩模(需转为灰度)
Mat mask = imread("logo_mask.png", IMREAD_GRAYSCALE); 

logo.copyTo(roi, mask); // 仅非透明区域覆盖背景
imwrite("Result", background);

2.图像修补

Mat damaged = imread("damaged.jpg");
Mat patch = imread("patch.jpg");  // 修复补丁
Mat repairMask = imread("repair_mask.png", IMREAD_GRAYSCALE); // 损坏区域掩模

patch.copyTo(damaged, repairMask); // 仅替换掩模标记区域

三.代码实战

我们把一个图像叠加到另一个图像上,这里有需要注意的点是我们使用的图片需要上传到板子上,因为运行程序的时候,./xxx是在当前目录运行的,当前目录没有图片就会报错

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{// 加载背景图像Mat src_image_pic = imread("landscape.jpg");if (src_image_pic.empty()) {cerr << "错误: 无法加载背景图像 frame1.jpg" << endl;return -1;}// 加载logo图像Mat logo_image_pic = imread("jaychou.jpg");if (logo_image_pic.empty()) {cerr << "错误: 无法加载logo图像 jaychou.jpg" << endl;return -1;}// 确保logo尺寸不超过背景图像if (logo_image_pic.cols > src_image_pic.cols || logo_image_pic.rows > src_image_pic.rows) {cerr << "错误: logo尺寸大于背景图像" << endl;return -1;}// 创建感兴趣区域(ROI)Mat logo_image_roi = src_image_pic(Rect(0, 0, logo_image_pic.cols, logo_image_pic.rows));// 将logo复制到ROIlogo_image_pic.copyTo(logo_image_roi);// 保存结果bool saved = imwrite("copyImage_output.jpg", src_image_pic);if (!saved) {cerr << "错误: 无法保存图像 copyImage_output.jpg" << endl;return -1;}cout << "图像已成功保存为 copyImage_output.jpg" << endl;return 0;
}

http://www.lryc.cn/news/2402965.html

相关文章:

  • TeamCity Agent 配置完整教程(配合 Docker Compose 快速部署)
  • 基于深度强化学习的Scrapy-Redis分布式爬虫动态调度策略研究
  • 在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven)
  • Tika Server:企业级文档内容解析的轻量级服务化方案
  • LMG1020YFFR 电子元器件详解
  • 防爆型断链保护器的应用场景有哪些?
  • leetcode_206 反转链表
  • OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow
  • 高考:如何合理选择学科、专业以及职业
  • K8S认证|CKS题库+答案| 3. 默认网络策略
  • HTTP、WebSocket、SSE 对比
  • Linux编程:1、文件编程
  • Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
  • 【Spark征服之路-2.3-Spark运行架构】
  • PART 6 树莓派小车+QT (TCP控制)
  • 软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码
  • Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab
  • 【芯片设计- RTL 数字逻辑设计入门 4.2 -- 组合逻辑赋值 + 时序逻辑状态保持】
  • 如何使用索引和条件批量更改Series数据
  • Java转Go日记(六十):gin其他常用知识
  • 89.实现添加收藏的功能的后端实现
  • v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统
  • 如何创造出一种不同于程序语言的人与机器自然交互语言?
  • 宝塔think PHP8 安装使用FFmpeg 视频上传
  • 26.【新型数据架构】-零ETL架构
  • 静态相机中的 CCD和CMOS的区别
  • 【MySQL基础】数据库的备份与还原
  • bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))
  • 为UE5的Actor添加能够读写姿态的功能
  • 机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战