导读
本文主要介绍如何用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);