感兴趣区域
有时我们只对一张图像中的部分区域感兴趣,而原图像又比较大,如果带着非感兴趣区域一起处理会占用大量的内存,因次我们希望从原图像中截取部分图像后再进行处理。我们将这个区域称为感兴趣区域(Region Of Interest, ROI)
OpenCV4提供了两种截取ROI的方式
从原图中截取部分内容,就是将需要截取的部分在原图像中标记出来,可以用Rect数据结构标记,也可以用Range数据结构标记,这两种数据结构在下面给出
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height)
cv::Range(int start, int end)
- _Tp:一种数据类型。c++模板特性,可以用int,double,float等替换
- _x:矩形区域左上角第一个像素的x的坐标,也就是第一个像素的列数
- _y:矩形区域左上角第一个像素的y的坐标,也就是第一个像素的行数
- _width:矩形的宽,单位为像素,即矩形区域跨越的列数
- _height:矩形的高,单位为像素,即矩形区域跨越的行数
- start:区间的起始
- end:区间的结束
例如在img中截取图像,可以img(Rect(p.x,p.y,width,height))
Range只是表明一个区间范围,img(Range(rows_start,rows_end),Range(cols_start,cols_end))
OpenCV4中对图像的赋值和拷贝分为浅拷贝和深拷贝,浅拷贝是建立一个可以访问图像数据的变量
深拷贝是将图像数据再复制一份
在图像处理的过程中OpenCV中提供了copyTo()函数实现两类方法(其中在Mat类中定义的copyTo()有两种重载方式)进行深拷贝
copyTO()函数原型:
void cv::Mat::copyTo(OutputArray m) const
void cv::Mat::copyTo(OutputArray m,
InputArray masl
)const
void cv::copyTo(InputArray src,
OutputArray dst,
InputArray mask
)
在Mat类中copyTo()函数有两中重载方式,一种是只需要输入一个与原函数具有相同尺寸和类型的Mat类变量或者空的Mat类变量
另一种需要在输入Mat类变量时输入一个掩模矩阵,矩阵只能是CV_8U数据变量,与原图像具有相同的尺寸,通道数可以是1个或0个
示例:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("E:\\CLion\\opencv_xin\\SG\\SG_0.jpg");
Mat noobcv = imread("E:\\CLion\\opencv_xin\\SG\\SG_1.jpg");
if (img.empty() || noobcv.empty())
{
cout << "Error" << endl;
return -1;
}
Mat ROI1,ROI2,ROI2_copy,mask,img2,img_copy,img_copy2;
resize(noobcv,mask,Size(200,200));
img2 = img; //浅拷贝
//深拷贝的两种方式
img.copyTo(img_copy2);
copyTo(img,img_copy,img);
//两种在图中截取ROI的方式
Rect rect(206,206,200,200); //定义ROI
ROI1 = img(rect); //截图
//ROI是浅拷贝,在后面深拷贝改变了ROI1,原图像img随之改变
ROI2 = img(Range(300,500),Range(300,500)); //第二种截图方式
img(Range(300,500),Range(300,500)).copyTo(ROI2_copy); //深拷贝
mask = img(rect);
mask.copyTo(ROI1); //在图像中加入部分图像
imshow("加入noobcv后图像",img);
imshow("ROI1对ROI2的影响",ROI2);
imshow("深拷贝的ROI2_copy",ROI2_copy);
circle(img,Point(300,300),20,Scalar(0,0,255),-1);
imshow("浅拷贝的img2",img2);
imshow("深拷贝的img_copy",img_copy);
imshow("深拷贝的img_copy2",img_copy2);
imshow("画图对ROI1的影响",ROI1);
waitKey(0);
return 0;
}