感兴趣区域(ROI)
ROI
简介
-
有时,我们只对一幅图像中的部分区域感兴趣,而原图像又十分大,如果带着非感兴趣区域一次处理,就会对程序的内存造成负担,因此,我们希望从原始图像中截取部分图像后再进行处理。我们将这个区域称作感兴趣区域(Region of Internet,ROI)。
-
从原图中截取部分内容,就是将需要截取的部分在原图像中的位置标记出来,可以用 Rect 数据结构标记,也可以用 Range 数据结构标记
API
Rect(T x,T y,T width,T height)
cv::Range(int start, int end)
- T:数据类型,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))
实现
实例代码:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat3b img = imread("/home/kslas/OpenCV/lena.tif");
Mat3b crop = imread("/home/kslas/OpenCV/test.png");
imshow("Original1", img);
imshow("Original2", crop);
Rect rect(150, 80, 180, 200);
Mat3b ROI1 = img(rect);
Mat3b ROI2 = crop(Range(80, 280), Range(150, 330));
ROI2.copyTo(ROI1);
imshow("add ROI", img);
imshow("ROI", ROI1);
waitKey(0);
destroyAllWindows();
return 0;
}
运行结果: