Opencv回顾--Roi和掩膜操作
主要函数
构建Roi的两种方式
1)使用Rect函数,指定矩形的左上角坐标和矩形的长宽来定义一个矩形区域作为ROI区域;
Rect rect(cx - 100, cy - 100, 200, 200);
//先建立一个矩形
Mat roi = src(rect);
2)利用Range来指定感兴趣的行和列的范围,Range是指从初始索引到终止索引的(不包括终止索引)的一段连续序列;
Mat imageROI = image(Range(y,y+imageROI.rows),Range(x, x+image.ROI.cols));
Range()
1.Range是OpenCV中新加入的一个类,该类有两个关键的变量start和end;
2.Range对象可以用来表示矩阵的多个连续的行或者多个连续的列
3.Range表示范围从start到end,包含start,但不包含end;
4.Range类还提供了一个静态方法all(),这个方法的作用如同Matlab中的“:”,表示所有的行或者所有的列
例子:
1.创建一个单位阵
Mat A= Mat::eye(10, 10, CV_32S);
2.提取第1到3列(不包括3)
Mat B = A(Range::all(),Range(1,3));
3.提取B的第5至9行(不包括9)
C= B(Range(5,9),Range::all());
对Roi进行操作
Mat src = imread("12345.jpg");
Rect rect(100, 100, 200, 200);
//规划处Roi区域
Mat roi = src(rect);
//类似于绑定roi
imshow("roi", roi);
Mat image = roi.clone();
roi.setTo(Scalar(255, 0, 0));
//Roi区域操作赋值 会映射到原图像中
//没有拷贝之前,ROI实际上共享simpleImage的内存,只是改变了一下ROI的Mat中的一些成员变量:
imshow("result", src);
image.setTo(Scalar(0, 200, 255));
imshow("copy roi", image);
imshow("result1", src);
掩膜操作
Mat src2 = imread("12345.jpg");
imshow("src2", src2);
Mat hsv, mask;
cvtColor(src2, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(35, 1, 46), Scalar(99, 255, 255), mask);
//通过HSV空间操作筛选出指定范围内的像素
imshow("mask", mask);
Mat person;
bitwise_not(mask, mask);
//反转 之前筛选出来确定出来的像素范围内的像素是255 不在范围内的是0
imshow("mask1", mask);
bitwise_and(src2, src2, person, mask);
// // 使用位“与”运算来叠加面具
imshow("person", person);
Mat result = Mat::zeros(src2.size(), src2.type());
result.setTo(Scalar(255, 0, 0));
//底色全是蓝色
Mat dst;
bitwise_not(mask, mask);
bitwise_or(person, result, dst, mask);
add(dst, person, dst);
imshow("dst", dst);