图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI。今天我们来看一下如何设置图像的感兴趣区域ROI。以及对ROI区域图像进行复制与替换。

在开始之前我们还是先来看一下Mat类型的数据存储方式以及对Mat类型变量赋值的方式。Mat类型的图像在内存中包含两部分的内容:矩阵头与图像数据矩阵的指针。矩阵头包含了图像的基本信息(如矩阵尺寸、存储方式、存储地址等),而数据指针则指向图像所有像素值的矩阵。通常复制Mat类型数据有两种方类型,一种是仅复制Mat变量的矩阵头与数据指针,但是不复制图像数据区域。第二种是不仅为复制Mat类型图像的矩阵头与数据指针,同时也把图像数据区域复制过去。这种方式处理的数据量会很大。

我们先来看第一种方式。

  1. Mat A = imread("i.jpg");
  2. Mat B, C;
  3. B = A;
  4. Mat(A);

已有图像A,新建图像B和C。我们分别通过赋值方式和构造函数初始化B和C。此时A、B、C均有各自的矩阵头与指针,并且其指针指向统一个图像数据区域。即可以理解为A、B、C三个指针均指向同一片内存地址。使用这种方法后,对A、B、C中任意一个图像操作后另外两个也会同时变化,因为他们指向同一片图像数据区域。示意图如下:

再来看第二种方式:

  1. Mat A = imread("i.jpg");
  2. Mat B, C;
  3. B = A.clone();
  4. A.copyTo(C);

同样已有图像A,新建图像B和C。我们分别通过clone函数与copyTo函数复制图像。此时A、B、C三个图像不仅有着各自的矩阵头与指针,并且三个图像的数据区域地质也是不同的,对其中一个操作不会影响另外两个。示意图如下:

接线来我们来看一下选择图像ROI区域的方法。同样有两种方法。

  1. Rect(x,y,width,height)//矩形框

Rect是一个矩形框。

x为起始列;

y为起始行;

width为宽度;

height为高度;

  1. Range(start,end)//感兴趣行列范围

Range是感兴趣起始行/列与终点行/列。

分别用上面两种方法表示图像img从(100,100)到(200,200)的区域为:

  1. img(Rect(100, 100, 100, 100));
  2.  
  3. img(Range(100, 200), Range(100,200));

实例

下面放出一个例子,读取图片img1"1.jpg"将原图拷贝到img4中,选取并显示img1中(200,200)到(300,300)区域的子图片,将该子图片保存到img3中,设定img5为img1中(100,100)到(200,200)的区域。将img1中img5区域的内容替换为img3.

  1. //************头文件包含*************
  2. #include "stdafx.h"
  3. #include<iostream>
  4. #include<opencv.hpp>//包含opencv的头文件
  5. //***********************************
  6.  
  7. //************命名空间***************
  8. using namespace cv;//使用opencv命名空间
  9. using namespace std;
  10. //***********************************
  11.  
  12. //************主函数*****************
  13. int main()
  14. {
  15. int c;
  16. Mat img1 = imread("1.jpg");
  17. Mat img2,img3,img4,img5;
  18.  
  19. img4 = img1.clone();//将img1图像复制到img4中,此复制连同数据区域一起复制
  20.  
  21. namedWindow("原图");//创建窗口
  22. namedWindow("ROI区域图");//创建窗口
  23. namedWindow("复制图");//创建窗口
  24.  
  25. while ()
  26. {
  27. img2 = img1(Rect(,,,));//选取img1中从(200,200)到(300,300)的ROI区域
  28. img5 = img1(Range(,+img2.rows),Range(,+img2.cols));//选取img1中从(100,100)开始与img2同样大小的ROI区域
  29. img3 = img2.clone();//将img2图像复制到img3中,此复制连同数据区域一起复制
  30. img3.copyTo(img5);//将img3图像复制到img5中,此时img1中相应的ROI区域数据也一起发生了变化
  31.  
  32. imshow("原图", img4);//显示图像
  33. imshow("ROI区域图", img2);//ROI区域图像
  34. imshow("复制图", img1);//显示合并后的图像
  35.  
  36. c = waitKey();//等待按键按下
  37. if (c == ||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
  38. break;
  39. }
  40.  
  41. return ;
  42. }

以下是结果:

下载

功能很简单,代码很少,建议自己写一下或者在博文中复制一下,当然实在是懒的不要不要的土豪可以去下面的连接直接下载。

【opencv学习笔记六】图像的ROI区域选择与复制

【opencv学习笔记六】图像的ROI区域选择与复制的更多相关文章

  1. 图像的ROI区域选择与复制

    [opencv学习笔记六]图像的ROI区域选择与复制 孜然   7 人赞同了该文章 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感 ...

  2. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

  3. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  4. OpenCV学习笔记(3)——图像的基本操作

    获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...

  5. OpenCV学习笔记(10)——图像梯度

    学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...

  6. OpenCV学习笔记(7)——图像阈值

    简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

  7. opencv学习笔记(04)——ROI

    ROI的用法:1.直接相加:2.掩码法 #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgpro ...

  8. opencv学习笔记(七)---图像金字塔

    图像金字塔指的是同一图像不同分辨率的子图的集合,有向下取样金字塔,向上取样金字塔,拉普拉斯金字塔....它是图像多尺度表达的一种,最主要的是用于图像的分割 向下取样金字塔指高分辨率图像向低分辨率图像的 ...

  9. opencv学习笔记(五)----图像的形态学操作

    图像的形态学操作有基本的腐蚀和膨胀操作和其余扩展形态学变换操作(高级操作)-----开运算,闭运算,礼帽(顶帽)操作,黑帽操作...(主要也是为了去噪声,改善图像) 形态学操作都是用于处理二值图像(其 ...

随机推荐

  1. mapreduce代码实现入门

    mapreduce代码主要包括三个类,map类.reduce类以及测试类! 以wordcount为例, map类为: static class WordMapper extends Mapper< ...

  2. 【转】win7 任务计划 任务映像已损坏或篡改(异常来自HRESULT:0x80041321)

    请这样操作:1. 以管理员身份运行命令提示符并执行命令chcp 437schtasks /query /v | find /i "ERROR: Task cannot be loaded:& ...

  3. nexus搭建maven私服及私服jar包上传和下载

    nexus搭建maven私服及私服jar包上传和下载 标签: nexus管理maven库snapshot 2017-06-28 13:02 844人阅读 评论(0) 收藏 举报 分类: Maven(1 ...

  4. TCP/UDP server

    Simple: Sample TCP/UDP server https://msdn.microsoft.com/en-us/library/aa231754(v=vs.60).aspx Simple ...

  5. QQ登录集成到自己网站php代码(转载)

    我们现在在各大网站论坛都可以看到点击一个QQ图标就可以利用自己的QQ号在网站进行登录了,下面我来告诉你一段QQ登录集成到自己网站php代码,有需要的朋友可参考. 1.打开open.qq.com 添加创 ...

  6. JVM--内存区的划分

    转自:http://www.jianshu.com/p/7ebbe102c1ae Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域. java虚拟机运行时数据区 一. ...

  7. Bootstrap——全局CSS样式

    1.栅格系统 containter:用于固定宽度并支持响应式布局的容器 container-fluid:用于100%宽度,占据全部视口(viewport)的容器 row:行,必须在container或 ...

  8. Eclipse的.properties文件输出中文成unicode编码

    今天添加log4j.properties时,无法输入中文,输入的中文直接变成了unicode的编码形式.原因是Eclipse的.properties文件的默认编码为iso-8859-1. 选择Wind ...

  9. __builtin_constant_p(x) (转帖

    本文转载自:http://blog.chinaunix.net/uid-29254195-id-3977753.html gcc的内建函数,当x为常数时返回1, x为变量时返回0. 不过这并不完全准确 ...

  10. html5手机网站需要加的那些meta标签,手机网站自适应

    的html5相关meta和标签    a.<!-- 强制让文档与设备的宽度保持1:1 -->    <meta name="viewport" content=& ...