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复制到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;
}
相关推荐
cooldream20093 分钟前
华为云Flexus+DeepSeek征文|基于华为云Flexus X和DeepSeek-R1打造个人知识库问答系统
人工智能·华为云·dify
Blossom.1183 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
DFminer4 小时前
【LLM】fast-api 流式生成测试
人工智能·机器人
郄堃Deep Traffic5 小时前
机器学习+城市规划第十四期:利用半参数地理加权回归来实现区域带宽不同的规划任务
人工智能·机器学习·回归·城市规划
GIS小天5 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
阿部多瑞 ABU6 小时前
主流大语言模型安全性测试(三):阿拉伯语越狱提示词下的表现与分析
人工智能·安全·ai·语言模型·安全性测试
cnbestec6 小时前
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
人工智能·线性代数·触觉传感器
不爱写代码的玉子6 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
sbc-study6 小时前
PCDF (Progressive Continuous Discrimination Filter)模块构建
人工智能·深度学习·计算机视觉
EasonZzzzzzz6 小时前
计算机视觉——相机标定
人工智能·数码相机·计算机视觉