Opencv----ROI设置

article/2025/9/22 6:27:10

1 ROI概念

      ROI是region of interest首字母的简写,翻译为感性趣的区域,其对象时图像。

      对于图像,其实就是一个二维数组,只不过这个二维数组有点特殊,它有头信息,在头信息里会有描述这个二维数组的大小、图片类型和数组元素的数据类型等。下面是一张从官方教程里获取的一张辅助理解的图片。

上面的图片只是一张灰度图,而我们常见的基本都是彩色图,在灰度图中一个像素我们用一个值就可以表示了,但在彩色的图片中一个像素要用3个值或4个值(有的图片有alpha通道)来表示。下面就是一个由三个值表示一个像素的辅助理解图(BGR格式的图片)。

 

容易发现,其颜色排列时BGR顺序,其实在OpenCV中很多图片都是BGR格式存储,和我们常见的到RGB格式的存储方式是相反的。其他图片的格式有很多种,如HVS、CyCbCr、HSI等格式。

2 为什么要设置ROI

图片是一个二维数组,而一般情况下,我们处理图像时只对其中的部分区域进行处理,例如我们想在图片某个区域打马赛克,为了性能考虑我们,可以只让程序对这部分信息进行处理而将其他部分忽略,这时我们就要设置图片感性趣的区域。设置完感性趣的区域后,其实是指针指到了ROI区域的左上角,好像我们截取了一张小图片一样,我们只对这张小图片进行处理就可以了,因其ROI指向的还是原图只在告诉它图片的起始位置和大小变了,所以在对ROI区操作会影响原图。

3 设置ROI

在OpenCV中有C和C++的代码,最早OpenCV是用C写的,在开发中C的代码写起来不太方便在版本进入2.0之后后续加入的代码改用C++,所以设置ROI的方法有两种即C和C++的,C的已不常用不过这里还会列出已方便了解。
C++

(void)setImageROI:(cv::Mat)image{// 设置ROI// 方法一cv::Mat roiImage = image(cv::Rect(100, 100, 200, 100));// 方法二,第一个range表示起始行和终止行,第二个range是起始列和终止列//cv::Mat roiImage = testImage(cv::Range(100, 100 + 100), cv::Range(100, 200 + 100));// 画一个矩形cv::rectangle(roiImage, cv::Rect(0, 0, 200, 100), cv::Scalar(255, 0, 0), 10);
}

设置ROI其实就是在原来图片上指定一个区域,而这个区域只是新创建了一个图片文件的头信息而已并没有产生新的图片,文件头里的图片区域的起始位置指向了ROI区域的左上角位置,所以在ROI上做的任何操作都会影响原图片。

C

(void)setImageROI:(IplImage *)image{// 记录图片的大小和区域CvRect currentRect = cvGetImageROI(image);// 设置ROI区域cvSetImageROI(image, cvRect(100, 100, 200, 100));// 画一个矩形cvRectangleR(image, cvRect(0, 0, 200, 100), CvScalar(255, 0, 0), 10);// 还原ROI区域cvSetImageROI(image, currentRect);// 上面的还原ROI区域要一个临时变量,也可通过下面的方法,还原ROI区域而不用创建临时变量//cvResetImageROI(image);
}

C没有生成一个文件头信息而是修改原来的文件头信息,所以要把文件头信息改回去。相比而言C++比C更加方便。

4 实例分析

一、设置ROI并画矩形

头文件:

#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>

下面是核心ROI代码

(UIImage *)getOpenCVImage{// 获取测试用的图片路径NSString * path = [[NSBundle mainBundle] pathForResource:@"test" ofType:nil];// 读取图片cv::Mat testImage = cv::imread([path cStringUsingEncoding:NSUTF8StringEncoding]);// 设置ROIcv::Mat roiImage = testImage(cv::Rect(100, 100, 100, 100));// 在ROI区域做操作,画一个矩形cv::rectangle(roiImage, cv::Rect(5, 5, 50, 50), cv::Scalar(255, 255, 255), 10);// 将图片的格式从BGR转换成RGB,如果不转会造成显示的图片颜色出错cv::cvtColor(testImage, testImage, cv::COLOR_BGR2RGB);// 返回UIImage类型的图片return MatToUIImage(testImage);
}

运行结果如下第一张是原图,第二张是处理后的图片,可以看到我们在ROI的(0,0)位置开始画矩形,但在大图中实际效果却不在左上角,这就是设置ROI的效果。

原始图

 

运行结果

超出ROI的效果

我们将上面代码改成正以下代码,让画矩形区域的高度大于ROI的高度。

// 放大矩形的高度,让其超出ROI的区域
cv::rectangle(roiImage, cv::Rect(0, 0, 200, 150), cv::Scalar(255, 0, 0), 10);

超出ROI操作的效果

可以看出,超出ROI的操作是被丢弃的。

二、设置ROI实现图片移位

上面说过设置ROI后我们就可以只对该区域进行操作。我们练习一下将一ROI区域的数据放到另一个ROI区域。

- (UIImage *)getOpenCVImage{// 获取测试用的图片路径NSString * path = [[NSBundle mainBundle] pathForResource:@"test" ofType:nil];// 读取图片cv::Mat testImage = cv::imread([path cStringUsingEncoding:NSUTF8StringEncoding]);// 设置ROI区域Acv::Mat roiImageA = testImage(cv::Rect(100, 100, 200, 100));// 设置ROI区域Bcv::Mat roiImageB = testImage(cv::Rect(300, 30, 200, 100));// 将roiImageB数据放到roiImageA的区域以实现图片区域移动效果roiImageB.copyTo(roiImageA);// 将图片的格式从BGR转换成RGB,如果不转会造成显示的图片颜色出错cv::cvtColor(testImage, testImage, cv::COLOR_BGR2RGB);// 将图片转成UIImage并返回return MatToUIImage(testImage);
}

代码运行后结果:

实现图片区域移动


http://chatgpt.dhexx.cn/article/8su0YFuH.shtml

相关文章

HALCON_C#_交互ROI

GDI知识讲解 GDI英文全称&#xff1a;Graphics Device Interface Plus, GDI是对GDI的扩展。 一&#xff0e; GDI概述 二.Graphics类介绍 Graphics 类封装了很多GDI绘图对象&#xff0c;并将这些对象显示到设备上。创建Graphics对象也被称为创建一个画板&#xff0c;创建画板一共…

OpenCV之图像ROI与ROI操作

python代码&#xff1a; import cv2 as cv import numpy as npsrc cv.imread("./test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) h, w src.shape[:2]# 获取ROI cy h//2 cx w//2 roi src[cy-100:cy100,c…

ROI Pooling和ROI Align、ROI Warp解析

文中很多内容来源于其他博客&#xff0c;较为详细&#xff0c;有需要可直接按目录跳选到自己需要的部分。 目录 简单介绍 实验比较 ROI理解 ROI Pooling ROI Pooling理解 ROI Pooling example ROI Pooling局限性 ROI Align理解 双线性插值法 ROI Align的反向传播 R…

RoI Pooling 和 RoI Align

RoI Pooling 和 RoI Align 一、背景和基本概念1.背景2.基本概念 二、RoI Pooling原理1.目的2.步骤&#xff08;以输出RoI feature大小为225为例&#xff09;Step1Step2Step3Step4 三、RoI Align原理1.目的2.步骤&#xff08;以输出RoI feature大小为225为例&#xff09;step1St…

ROI Pooling解析

ROI Pooling最早由Ross Girshick在2015年的论文fast rcnn中提出&#xff0c;是对ROI(Region of Interest)的Pooling操作&#xff0c;广泛应用于物体检测的研究领域。该操作旨在对输入特征图中不同大小的ROI利用池化方法获得固定大小的输出特征图。 ROI Pooling层的输入&#x…

ROI

栗子&#xff1a; #include<cv.h> #include<highgui.h> using namespace cv; //方法1&#xff0c;假如区域为长方形&#xff0c;使用MAT 构造函数设置区域内的值为255 int main() {Mat imageimread("boldt.jpg");//初始化掩模矩阵Mat mask Mat::zeros(…

OpenCV--0016:图像ROI与ROI操作

文章目录 一、图像ROI1. 概念2. 图像ROI操作2.1 矩形感兴趣区域2.1.1 使用Rect函数2.1.2 使用Range2.1.3 应用实例 2.2 不规则ROI区域2.2.1 通过inRange函数生成mask2.2.2 通过“与”操作提取ROI 一、图像ROI 1. 概念 图像ROI&#xff08;region of interest&#xff09;是指…

ROI pooling 和 ROI Align详解

ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示&#xff0c;在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性。 ROI Pooling 的局限性分析 …

【深度学习】ROI Pooling 和 ROI Align 计算机视觉 目标检测

文章目录 ROI Pooling和ROI Align&#xff1a;一篇好的文章ROI Pooling 如何计算&#xff1f;AdaptiveMaxPool2d 在做啥Fast RCNN或者Faster RCNN中都使用了ROI PoolingROI Align ROI Pooling和ROI Align&#xff1a; &#xff08;1&#xff09;ROI Pooling 是为了让特征图输出…

ROI Pooling

RCNN ref 1 步骤: 1.使用Selective Search方法生成候选区域 2.对每一个候选区域使用CNN进行特征提取 3.对提取到的特征送入到每一类的SVM分类器 判断该区域是否属于该类特征 4.使用回归器精修候选框的位置 候选框搜索阶段: 使用selective search方法生成候选框,由于CNN提取…

ROI 详解

SPPNet、roi pooling 和 average pooling之间的区别&#xff0c;都是起到对任意大小的输入产生固定的输出的作用。其中SPPNet、roi pooling是一样的。 下面对ROI Pooling 进行详解&#xff1a; ROI是Region of Interest的简写&#xff0c;指的是在“特征图上的框”&#xff1…

【深度学习小知识】ROI到ROI pooling 再到ROI Align

ROI&#xff01;RoI Pooling&#xff01; ROI详解RoI Pooling详解Pooling操作ROI pooling ROI Align详解 ROI详解 Region of interest(ROI),中文译为感兴趣区域。在计算机视觉领域&#xff0c;从输入的图像中框选处理待处理的区域就是ROI。 ROI / Region proposals大致过程&am…

MD5密钥

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

漫画戏说:如何破解MD5加密算法

本文将通过漫画的形式来解释&#xff1a;如何破解MD5加密算法。其中包括了暴力枚举法、字典法、彩虹表法三种破解MD5加密算法的方法。MD5破解原理都是利用了&#xff0c;被加密的数据与MD5加密算法所生成的哈希值并不是一一对应的关系&#xff0c;而是多对一&#xff0c;也就是…

基于量子计算的md5密码哈希破解方法

基于量子计算的md5密码哈希破解方法 背景 Md5密文破解&#xff08;解密&#xff09;可以说是网络攻击中的一个必不可少的环节&#xff0c;是黑客工具中的一个重要“辅助工具”。md5解密主要用于网络攻击&#xff0c;在对网站等进行入侵过程&#xff0c;有可能获得管理员或者其…

MD5与SHA

不管是MD5还是SHA&#xff0c;这一切的根本都是哈希算法&#xff0c;即单向函数 MD5 全称为 消息摘要算法版本5 &#xff08;Message Digest Algorithm 5&#xff09; 首先我要强调的是&#xff0c;MD5并不是加密算法&#xff0c;它是一种哈希散列算法。 但是其往往可以应用…

使用rainbowcrack破解md5密文

文章目录 1、rainbowcrack下载2、文件说明3、使用流程3.1 生成彩虹表3.2 排序彩虹表3.3 使用刚生成的彩虹表破解密文 4、实例4.1 生成彩虹表4.2 彩虹表排序4.3 破解密文 1、rainbowcrack下载 下载链接 2、文件说明 3、使用流程 环境&#xff1a;windows 前提&#xff1a;进入…

MD5算法破解思路

https://blog.csdn.net/wufaliang003/article/details/79794982 小明&#xff1a;老师&#xff0c;上次您讲了MD5算法。用它生成的信息摘要&#xff0c;真的可以被破解吗&#xff1f; 老师&#xff1a;有很多种方法可以破解&#xff0c;不过需要明确一点&#xff0c;这里所谓的…

MD5密文破解实验

实验目的与要求 1、 了解MD5加密的基本原理 2、 使用MD5Crack工具进行MD5解密 3、 使用网络资源对密文进行在线破解 4、 认真阅读并掌握本实验相关的知识点 5、上机实现实验所提到的工具和操作&#xff0c;得到实验结果&#xff0c;并填写实验报告 预备知识 MD5介绍 199…

破解MD5加密

本文摘自漫画戏说&#xff1a;如何破解MD5加密算法TOMORROW星辰 前言 这里所谓的破解并非是要把摘要还原成原文。因为MD5算法是用有穷的128位表示无穷的原文。对于MD5的破解&#xff0c;实际上都属于碰撞&#xff0c;比如原文A可以 通过MD5生成摘要M&#xff0c;我们只要找到…