在上一节,我们介绍了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表示将文字绘制到图像中指定的位置。

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

因为ROI图像和girl是共享内存的。所以,这样的操作,就相当于把logo图像插入到原图当中。
注意事项:在定义ROI的时候,一定要考虑边界问题。
——重庆教主 2025年5月14日
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
微信 | 支付宝 |
---|---|
![]() |
![]() |