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

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

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

我们先来看第一种方式。

Mat A = imread("i.jpg");

Mat B, C;

B = A;

Mat(A);

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

再来看第二种方式:

Mat A = imread("i.jpg");

Mat B, C;

B = A.clone();

A.copyTo(C);

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

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

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

Rect是一个矩形框。

x为起始列;

y为起始行;

width为宽度;

height为高度;

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

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

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

img(Rect(100, 100, 100, 100));

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.

//************头文件包含*************

#include "stdafx.h"

#include

#include//包含opencv的头文件

//***********************************

//************命名空间***************

using namespace cv;//使用opencv命名空间

using namespace std;

//***********************************

//************主函数*****************

int main()

{

int c;

Mat img1 = imread("1.jpg");

Mat img2,img3,img4,img5;

img4 = img1.clone();//将img1图像复制到img4中,此复制连同数据区域一起复制

namedWindow("原图");//创建窗口

namedWindow("ROI区域图");//创建窗口

namedWindow("复制图");//创建窗口

while ()

{

img2 = img1(Rect(,,,));//选取img1中从(200,200)到(300,300)的ROI区域

img5 = img1(Range(,+img2.rows),Range(,+img2.cols));//选取img1中从(100,100)开始与img2同样大小的ROI区域

img3 = img2.clone();//将img2图像复制到img3中,此复制连同数据区域一起复制

img3.copyTo(img5);//将img3图像复制到img5中,此时img1中相应的ROI区域数据也一起发生了变化

imshow("原图", img4);//显示图像

imshow("ROI区域图", img2);//ROI区域图像

imshow("复制图", img1);//显示合并后的图像

c = waitKey();//等待按键按下

if (c == ||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序

break;

}

return ;

}

以下是结果:

下载

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

图像的ROI区域选择与复制

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

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

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

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

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

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

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

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

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

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

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

opencv学习笔记(04)——ROI

ROI的用法:1.直接相加:2.掩码法 #include #include

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

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

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

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

随机推荐

Winform菜单和工具栏控件

1.ContextMenuStrip--右键菜单 可以绑定在任何一个控件上,添加操作快捷键,并可以设置多层 每行相当于一个按钮,输入-可添加分割线 2.MenuStrip--菜单 优先级最高,一定会出 ...

JS限制input输入的为数字并且有小数的时候最多保留两位小数

JS限制input用户输入的为数字并且有小数的时候最多保留两位小数,代码如下: html部分:

你可能感兴趣的:(opencv,手选roi区域)