图像的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<iostream>
#include<opencv.hpp>//包含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 (1)
	{
		img2 = img1(Rect(200,200,100,100));//选取img1中从(200,200)到(300,300)的ROI区域
		img5 = img1(Range(100,100+img2.rows),Range(100,100+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(0);//等待按键按下
		if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
			break;
	}
	return 0;
}以下是结果:



下载
功能很简单,代码很少,建议自己写一下或者在博文中复制一下,当然实在是懒的不要不要的土豪可以去下面的连接直接下载。
图像的ROI区域选择与复制的更多相关文章
- 【opencv学习笔记六】图像的ROI区域选择与复制
		图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ... 
- slickgrid ( nsunleo-slickgrid ) 8 区域选择与复制粘贴
		区域选择 区域选择是通过插件CellRangeSelector实现的,默认不支持跨冻结列进行选择,修正了选择,支持跨冻结列,代码如下,通过判断选择的起点和终点所落在的冻结范围进行计算,如从左往右进行复 ... 
- opencv——设置ROI区域
		#include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv\cv.h> #includ ... 
- 学习 opencv---(3) ROI 区域图像叠加&初级图像混合
		在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操 ... 
- ROI区域图像叠加
		ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以方框.圆.椭圆. 不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI.在Halcon.Op ... 
- Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理
		前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 图像属性 图像 ... 
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
		1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ... 
- opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)
		ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ... 
- 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法
		虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究. OpenCVchm文档中对cv ... 
随机推荐
- 【转载】自定义View学习笔记之详解onMeasure
			网上对自定义View总结的文章都很多,但是自己还是写一篇,好记性不如多敲字! 其实自定义View就是三大流程,onMeasure.onLayout.onDraw.看名字就知道,onMeasure是用来 ... 
- 详解php概念以及主配置文件
			浏览器仅能够解码HTML格式的文档,对于非HTML格式的文档,浏览器调用插件或者通过CGI接口调用其他程序来解码. 动态网站: 我们在服务器端或客户端执行了一段脚本或者一段程序,这段程序执行的结果根据 ... 
- 什么是OSI参考模型?
			一.OSI参考模型 1.OSI的来源 OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模 ... 
- 从SQLAlchemy的“缓存”问题说起
			https://www.jianshu.com/p/c0a8275cce99 0.4792017.11.22 00:07:04字数 1631阅读 6493 问题描述 最近在排查一个问题,为了方便说明, ... 
- JS定时器实现函数节流和防抖 -简单实现对比 -适用地方
			如题 (总结要点) 防止重复点击! 最近项目中遇见这个"函数抖动"的问题!快速点击前端xx按钮,造成数据多次加载进页面里,正常只显示10条数据,结果显示了20条数据,异常! 出现原 ... 
- MapReduce内存调优
			内存调优 Hadoop处理数据时,出现内存溢出的处理方法?(内存调优) 1.Mapper/Reducer阶段JVM内存溢出(一般都是堆) 1)JVM堆(Heap)内存溢出:堆内存不足时,一般会抛出如下 ... 
- 排序算法-堆排序(Java)
			package com.rao.linkList; import java.util.Arrays; /** * @author Srao * @className HeapSort * @date ... 
- OpenCV 学习笔记(11)【OpenCV】光流场方法标出前景(运动)和背景(静止)
			用光流场方法,标出前景(运动)和背景(静止). 环境:VS2017 + OpenCV3.4.1 光流场介绍可以参见英文版学习OpenCV3的第17章Tracking 英文原版学习OpenCV3下载链接 ... 
- 8259A的初始化(单片)
			1.单片8259A的初始化流程图: 在单片的初始化中不需要ICW3,因为ICW3是指明主片和从片的连接情况的. 2.程序解析: (1)ICW1 MOV AL,13H (2)ICW2 MOV AL,08 ... 
- cronicle minio s3 存储配置集成
			cronicle 后端存储是可配置的 ,通过使用不同的存储配置,我们可以解决多实例部署以及数据共享的问题 cronicle 的后端存储模型,设计的特别方便,包含了基于文件的,基于s3 的,同时我们也可 ... 
 
			
		