实战 | OpenCV绘制斜矩形并截取区域ROI保存(附代码)

2021-12-08 18:35:55 浏览数 (1)

导读

本文主要介绍如何用OpenCV绘制斜矩形并将绘制区域ROI截取保存。

背景介绍

在图像处理中正矩形ROI方便绘制和截取,使用广泛。但在某些情形中,目标本身是倾斜的(或者带角度的),这时候我们如何截取目标并保存呢?在OpenCV中我们可以使用RotateRect类和不规则ROI提取方法来实现。

实现步骤与演示

测试图像如下,假定我们要截取下面的IC器件:

【1】给定RotateRect的中心坐标、角度、大小,然后获取旋转矩形端点坐标,通过画线的方法绘制即可。

代码语言:javascript复制
Mat imgCopy = src.clone();
RotatedRect rotateRect;
rotateRect.center = Point2f(267.0, 160.0);
rotateRect.angle = -35;
rotateRect.size = Size2f(250.0, 180.0);
Point2f ptCorner[4];
rotateRect.points(ptCorner);
for (int j = 0; j < 4; j  )
{
  line(imgCopy, ptCorner[j], ptCorner[(j   1) % 4], Scalar(0, 0, 255), 2, 8);  //绘制最小外接矩形每条边
}
imshow("rotateRect", imgCopy);

【2】使用fillPoly方法可以实现填充绘制,具体代码如下:

代码语言:javascript复制
Point ppt[] = { ptCorner[0], ptCorner[1], ptCorner[2], ptCorner[3]};
const Point* pts[] = {ppt};
int npt[] ={4};
Mat mask = Mat::zeros(src.size(), CV_8UC1);
fillPoly(mask, pts, npt, 1, Scalar::all(255), 8); //画填充多边形
fillPoly(imgCopy, pts, npt, 1, Scalar(0, 0, 255), 8); //画填充多边形
imshow("mask", mask);
imshow("fillRect", imgCopy);

【3】创建旋转矩形区域对应的mask图像:

代码语言:javascript复制
Mat mask = Mat::zeros(src.size(), CV_8UC1);
fillPoly(mask, pts, npt, 1, Scalar::all(255), 8); //画填充多边形

【4】使用图像按位与操作bitwise_and提取不规则ROI:

代码语言:javascript复制
Mat result;
bitwise_and(src, src, result, mask);
imshow("ROI", result);

【5】获取旋转矩形的正外界矩形:

代码语言:javascript复制
vector<Point>contour;
contour.push_back(ptCorner[0]);
contour.push_back(ptCorner[1]);
contour.push_back(ptCorner[2]);
contour.push_back(ptCorner[3]);
Rect rect = boundingRect(contour);
rectangle(imgCopy, rect, Scalar(0, 255, 0), 2, 8);

【6】截取ROI结果:

代码语言:javascript复制
Mat srcROI = src(rect);
Mat maskROI = mask(rect);
Mat resultROI;
bitwise_and(srcROI, srcROI, resultROI, maskROI);
imshow("finalRect", resultROI);

0 人点赞