当前位置: 首页 > 编程日记 > 正文

OpenCV——使用ROI进行图像切割

ROI(region of interest)——感兴趣区域。

1.用途

这个区域是图像分析所关注的重点。圈定这个区域,以便进行进一步的处理。而且,使用ROI指定

想读入的目标,可以减少处理时间,增加精度,给图像处理带来不小的便利。

2.定义ROI方法

  • 使用表示矩阵区域的Rect。

它指定矩阵的左上角坐标(构造函数的前两个参数)和矩阵的长宽(构造函数的后两个参数)以定义一个矩阵区域。

// 定义一个Mat类型并给定其设定的区域
Mat imageROI;
// 方法一
imageROI = image(Rect(500, 250, logo.cols, logo.rows));
  • 指定感兴趣行或列的范围(Range)。

Range是指从起索引到终止索引(不包括终止索引)的一连串连续序列。cRange可以用来定义Range。如果使用Range来定义ROI,那么前例中定义ROI的代码可以重写为:

// 方法二
imageROI = image( Range(250, 250+logoImage.rows), 
Range(200, 200+logoImage.cols));

 3.切割具体步骤

  • 将要切割下的图像区域局部设置为ROI
void cvSetImageROI(IplImage* image,CvRect rect);
  • 创建一个与切割图像大小相同的新图像
IplImage* cvCreateImage( CvSize size, int depth, int channels );
    depth 图像元素的位深度,可以是下面的其中之一:
   
IPL_DEPTH_8U无符号8位整型
IPL_DEPTH_8S有符号8位整型
IPL_DEPTH_16U无符号16位整型
IPL_DEPTH_16S 有符号16位整型
IPL_DEPTH_32F单精度浮点数
IPL_DEPTH_64F双精度浮点数

    channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4.通道是交叉存取的
  • 将原图像复制到新图像中
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL ); 

操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。函数cvCopy从输入数组中复制选定的成分到输出数组:

如果mask(I)!=0,则dst(I)=src(I)。

如果输入输出数组中的一个IplImage类型的话,其ROI和COI将被使用。输入输出数组须是同样的类型、维数和大小。函数也可以用来复制散列数组(这种情况下不支持mask)。

  • 释放ROI区域
cvResetIamgeROI(src);

4.实例
  如何利用ROI将一幅图加到另一幅图的指定位置。

通过一个图像掩码,直接将插入处的像素设置为插入图像的像素值,这样效果会很逼真。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>using namespace cv;
using namespace std;bool  ROI_AddImage();
bool  LinearBlending();
bool  ROI_LinearBlending();
void   ShowHelpText();int main(   )
{system("color 6F");if(ROI_AddImage( )&& LinearBlending( )&&ROI_LinearBlending( )){cout<<endl<<"\n运行成功,得出了需要的图像";}waitKey(0);return 0;
}//----------------------------------【ROI_AddImage( )函数】----------------------------------
// 函数名:ROI_AddImage()
//    描述:利用感兴趣区域ROI实现图像叠加
//----------------------------------------------------------------------------------------------
bool  ROI_AddImage()
{// 【1】读入图像Mat srcImage1= imread("dota_pa.jpg");Mat logoImage= imread("dota_logo.jpg");if( !srcImage1.data ) { printf("读取srcImage1错误~! \n"); return false; }if( !logoImage.data ) { printf("读取logoImage错误~! \n"); return false; }// 【2】定义一个Mat类型并给其设定ROI区域Mat imageROI= srcImage1(Rect(200,250,logoImage.cols,logoImage.rows));// 【3】加载掩模(必须是灰度图)Mat mask= imread("dota_logo.jpg",0);//【4】将掩膜拷贝到ROI
    logoImage.copyTo(imageROI,mask);// 【5】显示结果namedWindow("<1>利用ROI实现图像叠加示例窗口");imshow("<1>利用ROI实现图像叠加示例窗口",srcImage1);return true;
}//---------------------------------【LinearBlending()函数】-------------------------------------
// 函数名:LinearBlending()
// 描述:利用cv::addWeighted()函数实现图像线性混合
//--------------------------------------------------------------------------------------------
bool  LinearBlending()
{//【0】定义一些局部变量double alphaValue = 0.5; double betaValue;Mat srcImage2, srcImage3, dstImage;// 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )srcImage2 = imread("mogu.jpg");srcImage3 = imread("rain.jpg");if( !srcImage2.data ) { printf("读取srcImage2错误! \n"); return false; }if( !srcImage3.data ) { printf("读取srcImage3错误! \n"); return false; }// 【2】进行图像混合加权操作betaValue = ( 1.0 - alphaValue );addWeighted( srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);// 【3】显示原图窗口imshow( "<2>线性混合示例窗口【原图】", srcImage2 );imshow( "<3>线性混合示例窗口【效果图】", dstImage );return true;}//---------------------------------【ROI_LinearBlending()】-------------------------------------
// 函数名:ROI_LinearBlending()
// 描述:线性混合实现函数,指定区域线性图像混合.利用cv::addWeighted()函数结合定义
//              感兴趣区域ROI,实现自定义区域的线性混合
//--------------------------------------------------------------------------------------------
bool  ROI_LinearBlending()
{//【1】读取图像Mat srcImage4= imread("dota_pa.jpg",1);Mat logoImage= imread("dota_logo.jpg");if( !srcImage4.data ) { printf("读取srcImage4错误~! \n"); return false; }if( !logoImage.data ) { printf("读取logoImage错误~! \n"); return false; }//【2】定义一个Mat类型并给其设定ROI区域
    Mat imageROI;//方法一imageROI= srcImage4(Rect(200,250,logoImage.cols,logoImage.rows));//方法二//imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));//【3】将logo加到原图上addWeighted(imageROI,0.5,logoImage,0.3,0.,imageROI);//【4】显示结果imshow("<4>区域线性图像混合示例窗口",srcImage4);return true;
}

参考:《OpenCV3编程入门》  毛星云 著

转载于:https://www.cnblogs.com/farewell-farewell/p/5905107.html

相关文章:

Asp.net动态生成html页面

作者&#xff1a;网际浪子专栏&#xff08;曾用名littlehb&#xff09; http://blog.csdn.net/littlehb/适用于&#xff1a;Microsoft ASP.NET 摘要:asp.net动态生成html页面,适用 简介 此功能适用于后台数据库功能不强的web站点&#xff0c;即大部分文本不是存放在数据库的…

View 5.1 重装上阵(4—基础架构篇)

从底层架构方面来看&#xff0c;VIEW 5.1最大的改进在于引入了Content-Based Read Cache(CBRC) 技术&#xff0c;大大降低了部署桌面虚拟化所带来的IOPS风暴&#xff0c;同时大大降低了对于存储的压力和成本&#xff0c;可谓桌面虚拟化领域的一大福音。 在以往的桌面虚拟化项目…

再见了,Python!!

结合我最近这些年的 Python 学习、开发经验&#xff0c;发现近90%的程序员在学 Python 时都会遇到下面这3个问题&#xff1a;1.想学Python&#xff0c;但不知从何学起&#xff0c;应用方向太多了也不知道该选择什么方向...2.基础入门看似简单&#xff0c;但是进阶实战就举步维艰…

alert在asp.net中如何使用??

改成这样&#xff1a;string str"<script languagejavascript>alert(省局数据不能进行修改&#xff01;);</script>";Page.RegisterStartupScript("dd",str); 提示成功后转到别的页面Response.Write("<script>window.alert(提示语…

.NET工程师必须掌握的知识点

以下内容是转载的 Microsoft SQL Server 数据库 一、创建和维护数据库 1、数据库 SQL Server 数据库的组成部分&#xff1f;&#xff08;参见联机丛书&#xff09;   如何保证数据库的完整性、安全性、并发性&#xff1f;   数据库设计创建步骤&#xff1f;&#xff08;参见…

@程序员:这些瓜没吃到,可以告别互联网了!

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

日志分析工具splunt

实验环境 网关 classroom 172.25.8.254 workstation 172.25.8.9 server a-jeth0 172.25.8.10-外网 eth1 192.168.0.x内网 eth2 192.168.1.x备用 -------------------------------------------- 需求&#xff1a; 设计&#xff1a; 原理&#xff1a;日志的作用&#xff0c;1&a…

正则表达式语法规则收集

turnmissile 的 Blog http://blog.csdn.net/turnmissile/ Microsoft已经把正则表达式的规则收录在了msdn里面了&#xff0c;有兴趣的朋友可以自己去研究一下(ms-help://MS.MSDNQTR.2003OCT.1033/cpgenref/html/cpconRegularExpressionsLanguageElements.htm)&#xff0c;这里罗…

Python实现信息自动配对爬虫排版程序

作者 | 李秋键责编 | 晋兆雨头图 | CSDN付费下载自视觉中国在很多的公司项目中&#xff0c;常常有很多对office项目的比较机械化的操作&#xff0c;在这里就可以借助python实现对office的合理排版。而这里我们就将借助海尔公司的出货表爬取对应图片信息&#xff0c;并重新排版成…

关于2012年度土建工程专业中级专业技术资格考试有关问题的通知

关于2012年度土建工程专业中级专业技术资格考试有关问题的通知 现将2012年度土建工程专业初、中级专业技术资格考试、报名、培训工作有关事项通知如下&#xff1a; 一、考试组织 湖南省住房和城乡建设厅、省人力资源和社会保障厅联合成立领导小组&#xff0c;负责对考试工作进行…

Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

做出的C++选择以及背后的原因

要让出资人明白你做出的C选择以及背后的原因。也许出资人会有更容易操作、更快实现的好主意。3、为你提供的日期说明信心范围。很可能管理层不明白你的估算意味着什么&#xff0c;而且你也有可能不理解他们所要的东西。 2&#xff0e;变量的C使用范围每个变量的使用范围只在定义…

拖放 DataGrid 列--来自MSDN

发布日期&#xff1a; 09/19/2004| 更新日期&#xff1a; 09/19/2004Chris SanoMicrosoft Corporation 摘要&#xff1a;了解如何利用基本的 GDI 功能&#xff0c;从而通过 DataGrid 控件获得可视化效果。通过跨越托管边界进行调用&#xff0c;可以利用本机 GDI 功能来执行屏幕…

最近很火的最新一代国际视频标准 VVC 到底是什么?阿里专家为你揭秘

作者 | 叶琰&#xff0c;阿里巴巴达摩院XG实验室视频标准团队负责人责编 | 夕颜头图 | CSDN付费下载自视觉中国2020年7月1日晚上&#xff08;日内瓦时间&#xff09;&#xff0c;第十九次JVET会议在线上落下帷幕&#xff0c;新一代国际视频编码标准VVC第一版&#xff08;Versat…

nesC编程入门

1.接口 NesC程序主要由各式组件&#xff08;component&#xff09;构成&#xff0c;组件和组件之间通过特定的接口&#xff08;interface&#xff09;互相沟通。一个接口内声明了提供相关服务的方法&#xff08;C语言函数&#xff09;。例如数据读取接口&#xff08;Read&#…

用asp.net实现的把本文推荐给好友功能

作者&#xff1a; 飞鹰 www.ASPCool.com 时间:2001-11-25 17:39:07 ///<summary> ///<author>飞鹰ASPCool.com</author> ///<description>本文用asp.net实现把此文推荐给好友的功能。</desciption> ///<copyright>ASP酷技术资讯…

Access sql语句创建表及字段类型

创建一张空表&#xff1a; Sql"Create TABLE [表名]" 创建一张有字段的表&#xff1a; Sql"Create TABLE [表名]([字段名1] MEMO NOT NULL, [字段名2] MEMO, [字段名3] COUNTER NOT NULL, [字段名4] DATETIME, [字段名5] TEXT(200), [字段名6] TEXT(200)) 字段类…

“刚毕业1年,做Python能挣多少?”网友:吹的不多..

01现状揭秘&#xff1a;Python的火持续燃烧程序员&#xff1a;心态崩了&#xff01;2020年转眼已经大半&#xff0c;在近几个月的榜单中&#xff0c;Python已经连续走上卫冕的道路&#xff0c;并且与Java的差距拉得更远了一些。以往与Java常呈现你追我赶之势&#xff0c;而这一…

Java编程的逻辑 (39) - 剖析LinkedList

本系列文章经补充和完善&#xff0c;已修订整理成书《Java编程的逻辑》&#xff0c;由机械工业出版社华章分社出版&#xff0c;于2018年1月上市热销&#xff0c;读者好评如潮&#xff01;各大网店和书店有售&#xff0c;欢迎购买&#xff0c;京东自营链接&#xff1a;http://it…

运用.NET读写Windows注册编辑表

作者&#xff1a; 冉林仓 www.ASPCool.com 时间:2001-11-9 如果你曾经使用过RegOpenKeyEx、RegCreateKeyEx、RegCloseKey等Win32 API函数读写过注册编辑表&#xff0c;你肯定非常熟悉这些复杂的Registry函数。相反&#xff0c;在.NET框架中&#xff0c;Registry和RegistryK…

使用正则表达式抽取新闻/BBS网页发表时间

package org.apache.nutch.parse.html; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 分析时间戳 * * author xum * */ public class Publish…

为什么Python没有main函数?

作者 | 豌豆花下猫来源 | Python猫&#xff08;ID:python_cat&#xff09;众所周知&#xff0c;Python中没有所谓的main函数&#xff0c;但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。其实&#xff0c;可能他们是想模仿真正的main函数&#xff0c;但是…

HTTP访问服务的相关解释

一、访问网站的基本流程第一步&#xff1a;客户端用户在浏览器输入www.51cto.com网站&#xff0c;回车后&#xff0c;系统首先会查找系统本地的DNS缓存及hosts文件信息&#xff0c;确定是否存在www.51cto.com余名对应的IP解析记录&#xff0c;如果有就直接获取IP地址&#xff0…

关于ASP.Net中的时间处理

作者&#xff1a; 飞刀 www.ASPCool.com 时间:2001-8-8 这里我想谈谈ASP.Net中对时间的处理 在ASP.Net中&#xff0c;M$为我们提供一种名为DateTime的对象&#xff0c;我们用这个对象来取得当前的时间。比如&#xff1a; DateTime dtDateTime.Now; 在上面…

还缺30万人!程序员2020年要过好日子了……

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

淘宝海量数据库之二:一致性选择

众所周知&#xff0c;一致性是数据最关键的属性之一。2000年&#xff0c;Eric Brewer教授在ACM分布式计算年会上指出了著名的CAP理论&#xff1a; Brewer, E. A. 2000. Towards robust distributed systems. In Proceedings of the 19th Annual ACM Symposium on Principles of…

Linux 小记录!

rmdir与 rm -r 的不同处前者这能删除目录 后者目录和文件都可以删除cp 和echo 都会覆盖原有的内容ctrl &#xff0b; c 强制中断这条命令/前后是没有空格的快捷键&#xff1a;TAB 命令 路径补全符号&#xff1a;; 多个命令的分隔符/ 根或者路径的分隔符。> 标准输出重定向…

Session 详解

作者&#xff1a; heallven www.ASPCool.com 时间:2004-8-28 阅读本文章之前的准备 阅读本文章前&#xff0c;需要读者对以下知识有所了解。否则&#xff0c;阅读过程中会在相应的内容上遇到不同程度的问题。 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的S…

实现一个模拟CMD.exe命令编辑模式执行与显示的Delphi控件

cmd.exe这个东西是Windows系统自带的执行Dos的一个灰常好的人机命令交互的执行方式&#xff0c;现在很多脚本语言也都带有这种即时解释的人机模式。当下由于工程的需要&#xff0c;也要做一个类似命令解释显示的编辑器&#xff0c;基本上完全模拟Cmd.exe的这种交互模式&#xf…

谷歌这波大动作,暴露了什么信号?

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来&#xff0c;谷歌致力于推动围绕 GoogleCloud 的企业业务&#xff0c;但在这方面一直被亚马逊和微软吊打&#xff0c;这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…