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

opencv 学习: 04 通过ROI处理图片局部数据,以添加水印为例

展示如何访问和修改由 cv::Mat 表示的图像的像素值。

以及在图片中定义一个 ROI (region of interest)

ROI (Region of interest)

有时,我们只需要对图片的某个区域进行处理。这就需要定义一个 ROI 来达成这个目的。

假设,想要将一个小图片,比如添加logo水印,拷贝到一个大的图片上去。

此时我们可以在被拷贝的大图上定义一个ROI,这个ROI就决定了logo水印将被粘贴的位置。

使用 cv::Rect 定义ROI:

// logo 将被放置在 图片的右下角
cv::Rect roi = cv::Rect(image.cols - logo.cols,// ROI coordinates ximage.rows - logo.rows,// ylogo.cols,//widthlogo.rows); //

然后,可以使用 该 ROI ,在目标图片的 Mat 对象上,得到一个对应 ROI 的 Mat 对象。image_roi 指向目标图片,并且使用roi对象记录了对应的区域。目标图片mat引用计数会增加。

//简单说就是利用ROI ,在目标image上定义一个新的 Mat
cv::Mat image_roi(image,roi);

image_roi 就相当于 目标图片上对应区域的映射,对其的操作,将会作用于该目标图片。最后其实就是直接赋值拷贝即可。

logo.copyTo(image_roi); // 将logo图片复制到roiImage中

完整代码:

#include <iostream>
#include <opencv2/opencv.hpp> int main(int argc, char* argv[]) 
{// 检查命令行参数if (argc != 4) {std::cerr << "Usage: " << argv[0] << " <input_image> <logo_image> <output_image>" << std::endl;return -1;}// 读取输入图像 imread 完成对文件的读取,图片数据的解码,存放为 Mat 对象 这三个功能cv::Mat inputImage = cv::imread(argv[1]);if (inputImage.empty()) {std::cerr << "Error: Could not load image " << argv[1] << std::endl;return -1;}cv::Mat logo = cv::imread(argv[2]);if (logo.empty()) {std::cerr << "Error: Could not load logo image " << argv[2] << std::endl;return -1;}std::cout << "[1] Input Image... "<< std::endl;// 显示原始图片cv::namedWindow("Input Image", cv::WINDOW_NORMAL);// 被显示的图片会经过一定的预处理,CV_16U和CV_32S 的像素值类型会被除以256.浮点型像素也会将 在 0.0 - 1.0之间的数据显示,小于 0 的显示黑色,大于1显示为白色。cv::imshow("Input Image", inputImage);cv::waitKey(0);std::cout << "[2] Logo Image... "<< std::endl;// 显示logo图片cv::namedWindow("Logo Image", cv::WINDOW_NORMAL);// 被显示的图片会经过一定的预处理,CV_16U和CV_32S 的像素值类型会被除以256.浮点型像素也会将 在 0.0 - 1.0之间的数据显示,小于 0 的显示黑色,大于1显示为白色。cv::imshow("Logo Image", logo);cv::waitKey(0);std::cout << "[3] ROI... "<< std::endl;// 注意 roi x y width height 的 值不能为负,否则抛出异常cv::Rect roi = cv::Rect(inputImage.cols - logo.cols,inputImage.rows - logo.rows,logo.cols,logo.rows);//cv::Mat roiImage = inputImage(roi);cv::Mat image_roi(inputImage,roi);logo.copyTo(image_roi); // 将logo图片复制到roiImage中//这样其实是不行的,相当于将 image_roi 的数据指向了logo。//而不是像 copyTo 一样复制数据//image_roi = logo;// 显示结果图片std::cout << "[4] Output Image... "<< std::endl;cv::namedWindow("Output Image", cv::WINDOW_NORMAL);// 被显示的图片会经过一定的预处理,CV_16U和CV_32S 的像素值类型会被除以256.浮点型像素也会将 在 0.0 - 1.0之间的数据显示,小于 0 的显示黑色,大于1显示为白色。cv::imshow("Output Image", inputImage);cv::waitKey(0);//保存std::cout << "[5] Save Image... "<< std::endl;if (!cv::imwrite(argv[3], inputImage)) {std::cerr << "Error: Could not save image to " << argv[3] << std::endl;return -1;}std::cout << "Input image: " << argv[1] << std::endl;std::cout << "Output image: " << argv[2] << std::endl;cv::destroyAllWindows();return 0;
}

效果如下:水印被放置在最右下角。
请添加图片描述

http://www.dtcms.com/a/553031.html

相关文章:

  • 中小企业网站模板诚信网站平台建设方案
  • chatgpt崩溃了,gpt怎么了
  • [MySQL] 页与索引
  • 2025年AI生成PPT工具评测:以“全链路一体化服务能力”为尺,ChatPPT再登顶
  • 天津特定网站建设推广搜素引擎优化
  • 直播美颜sdk特效功能架构全解析:从图像处理到AI渲染的技术演进
  • 2025强网杯web wp
  • 超融合架构下,如何智能调度让每台虚拟机都“跑得更快”?
  • 【Web应用安全】SQLmap实战DVWA SQL注入(从环境搭建到爆库,完整步骤+命令解读)
  • 从零打造 Telegram 中文生态:界面汉化 + 中文Bot + @letstgbot 搜索引擎整合实战
  • QT 给Qimage数据赋值,显示异常,像素对齐的坑
  • wordpress 整站下载万江做网站
  • 谈谈设计和建设网站体会摄影网站建设的功能有哪些
  • ESP 8684模组上的IO6引脚相关问题处理办法
  • 李宏毅机器学习笔记37
  • 大模型-Qwen-Agent框架:系列Agent功能介绍 (1)
  • 18. React的受控和非受控组件
  • cocos 在animation播放后调整widget右对齐能避免动画position影响对齐
  • RAG_混合检索
  • Pytorch 预训练网络加载与迁移学习基本介绍
  • 企业官网响应式网站作品网站
  • Ubuntu20.04操作系统搭建gitlab详细教程
  • MySQL:with窗口函数说明及使用案例
  • 【C++学习】对象特性--继承
  • 常州外贸网站浦东区建设工程监督网站
  • AI+产业革命:人工智能如何成为新质生产力的“第一加速器”
  • Linux应用开发-6-GPIO系统控制蜂鸣器
  • LeetCode 刷题【140. 单词拆分 II】
  • 网站开发 犯法网站漏洞扫描工具
  • 漏洞修复学习之CVE-2023-38545漏洞复现与修复