Opencv中文网

在图像中插入水印logo

在上一节,我们介绍了ROI,通过定义ROI并从原图中获取部分图像数据进行处理。在这一节,我们继续延伸感兴趣区域的更多应用。比如,将一张logo图插入到原图中。

#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    Mat girl = imread("images/girl.jpg", IMREAD_COLOR);//3通道(CV_8UC3)
    if (girl.empty()) {
        return 0;
    }
    imshow("girl", girl);//显示图像

    Mat logo(45, 200, CV_8UC3, Scalar(0, 0, 255));//logo图像(200*45)
    string text = "wpfsoft.com";
    Point pos(5, logo.rows / 2);			// 写入坐标 
    int font = FONT_HERSHEY_SIMPLEX;	    // 字体类型
    double scale = 1.0;						// 字号缩放
    Scalar color(255, 255, 255);		    // 红色
    int thickness = 2;						// 笔画粗细
    putText(logo, text, pos, font, scale, color, thickness);
    imshow("logo", logo);//显示图像
    imwrite("logo.jpg", logo);//保存图像

    Rect rect(girl.cols - logo.cols, girl.rows - logo.rows, logo.cols, logo.rows);//右下角区域
    Mat roi = girl(rect);
    if (!roi.empty()) {
        logo.copyTo(roi);
        imshow("girl2", girl);
        imwrite("output.jpg", girl);
    }

    waitKey(0);//等待按键
    return 0;
}

在上面的代码中, 大致分为4个步骤。首先加载一张3通道图像,下面是原图的效果。

原图

然后在内存中创建一张logo图像,这里用到了Mat、Point、Scalar、putText等知识点。Point表示图像中的坐标点,Scalar表示颜色,putText表示将文字绘制到图像中指定的位置。

logo

接着创建一个矩形ROI,这里的位置是以logo图像的宽高为基础,在girl图像的右下角创建一个ROI图像,最后利用copyTo函数,将logo图像数据拷贝到ROI图像中。

最终效果

因为ROI图像和girl是共享内存的。所以,这样的操作,就相当于把logo图像插入到原图当中。

注意事项:在定义ROI的时候,一定要考虑边界问题。

——重庆教主 2025年5月14日

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1