Opencv中的copyto函数

news2025/6/7 13:49:47

一.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复制到ROI
    logo_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.coloradmin.cn/o/2402965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度强化学习的Scrapy-Redis分布式爬虫动态调度策略研究

在大数据时代&#xff0c;网络数据的采集与分析变得至关重要&#xff0c;分布式爬虫作为高效获取海量数据的工具&#xff0c;被广泛应用于各类场景。然而&#xff0c;传统的爬虫调度策略在面对复杂多变的网络环境和动态的抓取需求时&#xff0c;往往存在效率低下、资源浪费等问…

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven)

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven) Jenkins 是一款开源的持续集成和持续交付(CI/CD)工具,在 DevOps 实践中有着广泛的应用。本文将手把手带你在 Ubuntu 24.04 LTS 系统中完成 Jenkins 的安装,并配置所需的全局工具:Git、JDK 和 Maven…

防爆型断链保护器的应用场景有哪些?

​ ​防爆型断链保护器是一种用于防止链条断裂导致设备损坏或安全事故的装置&#xff0c;尤其适用于存在爆炸风险的工业环境。以下是其主要应用场景&#xff1a; ​ ​1.石油化工行业 在石油化工厂、炼油厂等场所&#xff0c;防爆型断链保护器可用于保护输送设备&#xf…

OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模块中实现Brox光流算法的类。该类用于在 GPU 上高效地计算两帧图像之间的稠密光流&#xff08;Dens…

K8S认证|CKS题库+答案| 3. 默认网络策略

目录 3. 默认网络策略 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、官网找模板 3&#xff09;、按照题目要求创建networkpolicy 4&#xff09;、应用networkpolicy 5&#xff09;、检查策略 3. 默认网络策略…

Linux编程:1、文件编程

一、Linux 文件编程与 C 语言文件编程的区别 特性C 语言 I/O 库函数Linux 文件编程&#xff08;系统调用&#xff09;实现层面用户空间&#xff08;glibc 库&#xff09;内核空间&#xff08;系统调用&#xff09;跨平台性跨平台&#xff08;Windows/Linux&#xff09;仅限 Li…

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

【Spark征服之路-2.3-Spark运行架构】

运行架构 Spark 框架的核心是一个计算引擎&#xff0c;整体来说&#xff0c;它采用了标准 master-slave 的结构。 如下图所示&#xff0c;它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master&#xff0c;负责管理整个集群中的作业任务调度。图形中的 Executor …

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab 1. 环境准备2. API 网关--HTTP2.1 部署应用2.2 部署网关2.3 HTTP路径匹配2.4 HTTP头匹配 3. API网关--HTTPS3.1 创建TLS证书和私钥3.2 部署HTTPS网关3.3 HTTPS请求测试 4. API网关--TLS 路由4.1 部署应用4.2 部署网关…

Java转Go日记(六十):gin其他常用知识

1. 日志文件 package mainimport ("io""os""github.com/gin-gonic/gin" )func main() {gin.DisableConsoleColor()// Logging to a file.f, _ : os.Create("gin.log")gin.DefaultWriter io.MultiWriter(f)// 如果需要同时将日志写入…

89.实现添加收藏的功能的后端实现

实现完查看收藏列表之后&#xff0c;实现的是添加收藏的功能 我的设想是&#xff1a;在对话界面中&#xff0c;如果用户认为AI的回答非常好&#xff0c;可以通过点击该回答对应的气泡中的图标&#xff0c;对该内容进行添加 所以后端实现为&#xff1a; service类中添加&…

v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统

v1.0.1版本更新2025年5月22日发布-优雅草星云物联网AI智控系统 开源地址 星云智控官网&#xff1a; 优雅草星云物联网AI智控软件-移动端vue: 优雅草星云物联网AI智控软件-移动端vue 星云智控PC端开源&#xff1a; 优雅草星云物联网AI智控软件-PC端vue: 优雅草星云物联网AI…

如何创造出一种不同于程序语言的人与机器自然交互语言?

人机交互自然语言通过模拟人类日常交流方式&#xff0c;使机器能够理解并响应人类的自然表达&#xff0c;从而打破编程语言的复杂性壁垒&#xff0c;极大地提升人机协同的效率和自然性&#xff0c;让机器更好地融入人类的工作与生活场景。创造一种通用的人与机器自然交互语言是…

宝塔think PHP8 安装使用FFmpeg 视频上传

宝塔think PHP8 安装使用FFmpeg 一、 安装think PHP8二、安装 FFmpeg1&#xff0c;登录到宝塔面板。2&#xff0c;进入“软件商店”。3&#xff0c;搜索“FFmpeg”。4&#xff0c;选择版本点击安装。5&#xff0c;检查 FFmpeg 是否安装成功6&#xff0c; 在 ThinkPHP 8 中使用 …

26.【新型数据架构】-零ETL架构

26.【新型数据架构】-零ETL架构:减少数据移动,原系统直接分析;典型实现(AWS Zero-ETL) 一、零ETL的本质:从“数据搬运工”到“数据翻译官” 传统ETL(Extract-Transform-Load)需要将数据从源系统抽取、清洗、转换后加载到目标系统,这一过程往往耗时费力,且面临数据延…

静态相机中的 CCD和CMOS的区别

文章目录 CCD处理方式CMOS处理方式两者区别 首先根据 成像原理&#xff0c;CCD和CMOS的作用是一致的&#xff0c;都是为了将光子转化为数字图像&#xff0c;只是 转换的方式出现差异。 CCD处理方式 获取光子&#xff1a; 在电荷耦合器件&#xff08;CCD&#xff09;传感器中…

bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))

1.如图 2.分析 关键报错提示&#xff1a; undefined is not iterable (cannot read property Symbol(Symbol.iterator)) 直译&#xff1a; undefined是不可迭代的&#xff08;不能读取属性Symbol(Symbol.iterator)&#xff09; 理解&#xff1a; 有一个值、不存在&#x…

机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战

一、什么是支持向量机&#xff08;SVM&#xff09; 1. 基本概念 1.1 二分类问题的本质 在机器学习中&#xff0c;分类问题是最常见的任务之一。最简单的情况就是二分类&#xff1a;比如一封邮件是“垃圾邮件”还是“正常邮件”&#xff1f;一个病人是“患病”还是“健康”&a…

LLM Agent 如何颠覆股价预测的传统范式

写在前面 股价预测,金融领域的“圣杯”之一,吸引了无数研究者和投资者。传统方法从技术指标到复杂的计量经济模型,再到机器学习,不断演进,但市场的高度复杂性、非线性和充斥噪声的特性,使得精准预测依然是巨大的挑战。大型语言模型(LLM)的崛起,特别是LLM Agent这一新…

【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台

随着工业领域数字化进程的持续加快&#xff0c;Web 技术在实现实时监控、数据可视化与控制系统等方面正扮演着越来越核心的角色。来自智利的科技企业 Wise Data Global 就是这一趋势中的积极践行者。他们借助慧都科技代理的 DHTMLX Suite JavaScript UI 控件库&#xff0c;为遥…