ROI(region of interest),也就是感兴趣区域。当我们想要只是关注图片的一部分的时候,就可以使用ROI
有两种用法:
一cv::Rect
cv::Rect 表示一个矩形区域,是一个类
常用的构造函数如下:
Rect_ (_Tp _x, _Tp _y, _Tp _width, _Tp _height) //前两个参数表示的是所选区域的左上角的坐标值x和y, 后两个参数表示所选区域的宽和高。
它还有几个方法:
//左上角的点坐标
Point_<_Tp> tl() const;
//右下角的点的坐标
Point_<_Tp> br() const;
//尺寸
Size_<_Tp> size() const;
//矩形的面积
_Tp area() const;
当我们向输出的时候,可以这样使用:
Rect myrectangle=Rect(30,30,100,100);
//面积
cout<<"the area is : "<<myrectangle.area()<<endl;
//左上角坐标
cout<<"the top left point is : "<<myrectangle.tl()<<endl;
//右下角坐标
cout<<"the bottom right point is : "<<myrectangle.br()<<endl;
//输出宽
cout<<"the width is : "<<myrectangle.width<<endl;
//输出高
cout<<"the height is : "<<myrectangle.height<<endl;
//判断点(x,y)是否在矩形区域内
cout<<" point is in the rectangle: "<<myrectangle.contains(Point(x,y))<<endl<<endl;
接下来是ROI:
//读入一个图像
cv::Mat img = imread('D:\test.jpg');
//设定感兴趣的区域ROI
cv::Mat m_roi = img(cv::Rect(250,300,100,100));
二使用cv::Range
cv::Range是指感兴趣区域的行和列的范围,
扫描二维码关注公众号,回复:
3699155 查看本文章
cv::Range(Range(row1,row10),Range(cols1,cols10))
是指从起始索引到终止索引(不包括终止索引)的一段连续的序列。
下面是一个例子:
#include <opencv2/OpenCV.hpp>
using namespace cv;
using namespace cv;
int main(int argc, char *argv[])
{
//读入一个图像
cv::Mat img = imread('D:\test.jpg');
//设定感兴趣的区域ROI
cv::Mat m_roi = img(cv::Rect(250,300,100,100));
imshow("the original image",img)
imshow("the ROI",my_roi)
return 0;
}
记得要添加链接库
MASK
mask其实就是对于图像的并操作,我是这么理解的。mask也是跟图片大小的灰度图。如果mask像素为0,则原图像变为0,如果mask像素不为0,那么原图片被保留下来
下面看一个例子:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
Mat image, mask;
Rect r1(20, 20, 220, 320);//ROI
Mat img1, img2;
image = imread("l.jpg");
//设置掩膜,大小与原图片相同的灰度图
mask = Mat::zeros(image.size(), CV_8UC1);
//ROI区域设置为白色
mask(r1).setTo(255);
img1 = image(r1);//对于image进行掩膜操作
image.copyTo(img2, mask);
imshow("Image sequence", image);
imshow("img1", img1);
imshow("img2", img2);
imshow("mask", mask);
waitKey();
return 0;
}