opencv(C++) 如何在轮廓的最大外接矩形的外侧画一个更大的矩形

457 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

这是一个非常有趣的问题,搜了一下居然没发现有相关的博客,只能自己写了哎。这里也涉及到一个我还没有解决的疑问,直接上代码吧。

在轮廓的最大外接矩形外侧画一个更大的矩形

//输入图像是img

//轮廓检测
vector<vector<Point>> contours;   //轮廓
vector<Vec4i> hieracrchy;    //轮廓结构
findContours(dilate_dst, contours, hieracrchy, 3, 2, Point());   //检测最外围轮廓

for (int i = 0; i < contours.size(); i++)
{
	Rect rect = boundingRect(contours[i]);    //最大外接矩形
	//在最大外接矩形的外侧画一个更大一点的红色矩形框
	//rect是Rect类的一个对象,因此可以调用rect.x和rect.height等参数
	int x = rect.x - 3;    //更大矩形左上角顶点的x坐标
	int y = rect.y - 3;    //y坐标
	int height = rect.height + 6;    //高
	int width = rect.width + 6;      //宽
	rectangle(img, Point(x, y), Point(x + width, y + height), Scalar(0, 0, 255), 2);    //用左上和右下两个顶点坐标画矩形
}

opencv 画矩形有两种方法

// 一、用矩形两个对角点坐标画
void cv::rectangle(InputOutputArray img,  //输入和输出的图像
				Point pt1,      //矩形的一个顶点
				Point pt2,      //pt1的对角点
				const Scaler &color,   //矩形框颜色
				int thickness=1)       //矩形框宽度

// 二、用矩形左上角顶点和矩形的宽、高画
Rect rect=(x,y,width,height)    //左上角顶点的x、y坐标,矩形的宽、高
void cv::rectangle(InputOutputArray img,  //输入和输出的图像
				Rect rect,      //矩形
				const Scaler &color,   //矩形框颜色
				int thickness=1)       //矩形框宽度

报错

我用的是第一种方法,即用两个对角顶点画矩形。因为用第二种方法报错:

不存在从 ”int“ 转换到 “cv::Rect_" 的适当构造函数

代码如下,在第二行报错,大概就是说 rect.x-3 是int型,不能转换为 cv::Rect_ ,没搞懂,希望如果有大佬看到的话能指导一下。

Rect rect = boundingRect(contours[i]); //最大外接矩形 Rect re_rect = (rect.x - 3, rect.y - 3, rect.height + 6, rect.width + 6);