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);

Opencv回顾--Roi和掩膜操作
掩膜操作

	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);

Opencv回顾--Roi和掩膜操作