mat opencv 修改roi_设置图片ROI(OpenCV学习笔记之二)

ROI相关简介

ROI是什么

ROI是region of interest首字母的简写,翻译为感性趣的区域。其实在写本篇之前应该写一篇关于图片是什么的学习笔记,但又感觉里面没多少东西还不能承载一篇学习笔记,所以这里只简单提一下。

图片是什么

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

图片就是一个二维数组

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

BGR格式的图片

这张图片是从官网获取的。是不是觉得颜色的排序有点不对呀,我们想的应该是红在前才对,其实在OpenCV中很多图片都是BGR格式的和我们常见的到RGB格式的存储方式是相反的。具体为什么要用BGR格式还不清楚如有大神知道还请科普。其他图片的格式有很多种如,HVS、CyCbCr、HSI等格式,后续可能会专门写一篇关于图片格式的学习笔记,这里先对图片格式的介绍写这么多。

为什么要设置ROI

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

设置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简单多了。

代码实战

一、设置ROI并画矩形

以下代码是核心代码,其他简单的显示代码将不再列出。首先请导入以下头文件。

#import

#import

#import

然后下面是具体的ROI代码都有注释,原理上面已说明。

- (UIImage *)getOpenCVImage{

// 获取测试用的图片路径

NSString * path = [[NSBundle mainBundle] pathForResource:@"test" ofType:nil];

// 读取图片

cv::Mat testImage = cv::imread([path cStringUsingEncoding:NSUTF8StringEncoding]);

// 设置ROI

cv::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区域A

cv::Mat roiImageA = testImage(cv::Rect(100, 100, 200, 100));

// 设置ROI区域B

cv::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://www.mzph.cn/news/300730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gRPC四种模式、认证和授权实战演示

前言上一篇对gRPC进行简单介绍,并通过示例体验了一下开发过程。接下来说说实际开发常用功能,如:gRPC的四种模式、gRPC集成JWT做认证和授权等。正文1. gRPC四种模式服务以下案例演示,服务端用微软提供的模板创建,客户端…

ajax mode,DWR的三种Reverse Ajax Mode配置详解

Full Streaming ModeEarly Closing ModePolling Mode在DWR应用中.默认启用的是Full Streaming Mode .它是三种modes中最快的一种.它每60秒检查一次浏览器是否是活跃的.配置很简单:dwr-invokerorg.directwebremoting.servlet.DwrServletactiveReverseAjaxEnabledtrue然后在要使用…

WinXP中鲜为人知的28项隐藏功能

WinXP中鲜为人知的28项隐藏功能 Windows的很多隐藏功能,都没有直接体现在菜单或者系统的开始项中,而是直接以文件的形式存在于Windows安装目录中,今天,笔者就带大家认识一下它们吧。 1、免费的系统教程(system32文件…

摄像头预览左右翻转_轻薄翻转触控本里的高性能机型:惠普ENVY x360 13评测

自从今年3月末AMD锐龙4000系列处理器正式登陆移动平台以来,目前已有多款机型上市,并涌现出了不少高热度、高性价比的机型。我们也体验测试了其中数款机型,总体上给用户的印象是是价格香、性能强。而今天牛叔要聊的这款机型,也是搭…

Oracle用户、权限、角色管理

Oracle 数据库用户管理Oracle 权限设置一、权限分类:系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。二…

聊一聊关于聊天记录的存储

背景 即时通讯(Instant Messaging),也就是我们常说的 IM,其实在很多业务场景上都会有或多或少的应用,有的会是核心,有的会是辅助。既然是聊天,那么必然就会产生聊天记录,而且聊天记录随着人数的增加和时间的…

考勤机信息同步不到服务器,考勤机实时同步功能上线啦

一、考勤机管理重磅上线,告别手动处理打卡数据考勤机打卡仍然是当前企业主流的考勤方式,而考勤机打卡数据的核算也是HR最头痛的一点。HR每个月都要去电脑打开复杂难用的考勤机配套软件,导出并整理打卡数据,逐个统计员工的迟到、早…

对那些刷抖音外放音乐的人,就这么治他!| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅(视频源B站春风里、)我最讨厌抖音方外了!↓ ↓ ↓

Asp.net 2.0 发送电子邮件

在网上收集的资料,和一点自己的心得 资料1 最基本的小例子,帮助上的例子看着可真够乱的: privatevoidSendMail() { MailMessage message new MailMessage("发件人电子邮件地址", "收件人电子邮件地址"); …

python目前版本强势英雄_王者荣耀目前版本什么英雄强势?

谢邀。在我之前写天梯排行时,总有不少人质疑我的段位和实力,可能是我的排行跟他们理解有所出入,欢迎各位在评论区理性讨论。在写这篇天梯排行前,我先放一下我的段位,证明一下我并不是瞎写乱写的。以下是我2018.5.5打的…

windows 服务实现定时任务调度

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与c#应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的c#组件。Quartz的最新版本为Qu…

ios gb2312转utf-8

2019独角兽企业重金招聘Python工程师标准>>> 靠,想写个爬虫功能,结果一直是乱码,终于找到了转码的方法了 (NSString *) gb2312toutf8:(NSData *) data{ NSStringEncoding enc CFStringConvertEncodingToNSStringEncoding(kCFStr…

数学特级教师:数学除了做题目,我还必须让他们看这些!

▲ 点击查看很多时候,我们把数学简单的归为算数,归为计算能力,但数学更多的是一种培养逻辑思维能力的方式。包括一元二次方程、或者向量,或者几何证明。而在我们传统的数学课上,更多的是通过做题来理解数学知识&…

烟袋斜街-后海,印象已模糊

上个周末和猪头,廖廖一起去的。大家都神往已久,但是从未去过,这次一并去了,了却心愿。我不在北京,神往但是不能前去自然可以理解,但是他们两个已经在北京生活了六年,向往了六年,路程…

laya 怎么生成签名_PHP开发API接口签名生成及验证

开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证。我们在设计签名验证的时候,请注意要满足以下几点:可变性&a…

为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?

咨询区 Theyouthis:最近我将项目升级到 .NET Core 3 之后,我发现自带的 System.Text.Json.JsonSerializer 序列化器有一个奇葩的问题,它不支持对 类字段 的序列化。。。参考如下代码:namespace ConsoleApp6 {class Program{static…

Windows下MinGW编译vim7.4

学习了一段时间Vim,感觉有些功能真的很方便。因学习原因,工作平台更换到一台老式Xp电脑上,重新安装了Vim7.4。官网默认版本不支持等宽字体和GDI渲染,需要手工编译一个修改过的版本。 1、下载MinGW 直接从MinGW官网下载的是在线安装…

告别 ROR windows 部署的噩梦-在 windows 上面 使用 Apache 部署 Ruby On Rails

今天去赛博把给朋友做的网站部署一下,服务器是一台windows2003的服务器。本身没想到在windows2003上面配置 ROR 是一场噩梦,因为网上看到了很多的 IIS 和 ROR 文档。不做不知道,一做才知道那简直是噩梦。忙到下午5点多还是没有配置好&#xf…

除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、肥宅快乐水(qiu?)A岛-匿名版二、永远不轻言放弃知识冷知识青年 图片五目马丁饭三、终于知道怎么倒立问了冷知识日报社四、千万不能浪费文医疗音乐手绘君五、世界上所有采用十二生肖的国家冷知识日…

命中率_数据说话!詹姆斯的“皇家射手团”命中率为近十年最低

北京时间10月13日,湖人球员丹尼格林更新个人社交媒体,发布自己与奥布莱恩杯的合影等,并配文“随你怎么说,我又多了一样你拿不走的东西”。格林晒出自己与杜德利、詹姆斯的合影。此前,格林因为在NBA总决赛G5中未能命中极…