【OpenCV3】旋转矩形(cv::RotateRect)的绘制

在OpenCV3中的绘图详解中,我们详细地介绍了opencv3中所支持的各种几何形状的绘制,其中矩形的绘制接口为cv::rectangle(),但是这个接口只能用于绘制正常矩形(即cv::Rect定义的矩形,长是水平,高是竖直),但不支持旋转矩形(cv::RotateRect)的绘制。比如我们使用如下代码,通过若干点来拟合椭圆(cv::fitEllipse()),拟合出的椭圆是以椭圆的外接矩形呈现的,这个椭圆的外接矩形就是一个旋转矩形。


	//创建一个用于绘制图像的空白图  
	cv::Mat image = cv::Mat::ones(480, 640, CV_8UC3);
	//设置蓝色背景
	image.setTo(cv::Scalar(100, 0, 0));

	//输入拟合点  
	std::vector points;

	points.push_back(cv::Point(200, 240));
	points.push_back(cv::Point(300, 400));
	points.push_back(cv::Point(400, 360));
	points.push_back(cv::Point(500, 300));
	points.push_back(cv::Point(500, 200));
	points.push_back(cv::Point(300, 150));

	//将拟合点绘制到空白图上  
	for (int i = 0; i < points.size(); i++)
	{
		cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);
	}

	//获取拟合椭圆的外包围矩形
	cv::RotatedRect rotate_rect = cv::fitEllipse(points);
	//绘制拟合椭圆
	cv::ellipse(image, rotate_rect, cv::Scalar(0, 255, 255), 2, 8);

	cv::imshow("image", image);
	cv::waitKey(0);


【OpenCV3】旋转矩形(cv::RotateRect)的绘制_第1张图片

从代码中可以看出,我们可以使用cv::ellipse()来绘制椭圆。但是,如果我们想将这个外接的旋转矩形也绘制出来的话,该怎么操作?opencv中有没有提供专门用于绘制旋转矩形的函数?很遗憾,没有。


下面介绍两种种解决旋转矩形的绘制问题的方案。


1、使用cv::line()逐条边绘制

代码如下:

	//获取旋转矩形的四个顶点
	cv::Point2f* vertices = new cv::Point2f[4];
	rotate_rect.points(vertices);

	//逐条边绘制
	for (int j = 0; j < 4; j++)
	{
		cv::line(image, vertices[j], vertices[(j + 1) % 4], cv::Scalar(0, 255, 0));
	}


结果如下:

【OpenCV3】旋转矩形(cv::RotateRect)的绘制_第2张图片


2、使用cv::drawContours()函数进行绘制

代码如下:

	//获取旋转矩形的四个顶点
	cv::Point2f* vertices = new cv::Point2f[4];
	rotate_rect.points(vertices);
	
	std::vector contour;

	for (int i = 0; i < 4; i++)
	{
		contour.push_back(vertices[i]);
	}

	std::vector> contours;
	contours.push_back(contour);
	cv::drawContours(image, contours, 0, cv::Scalar(255, 255, 0), 1);


结果如下:

【OpenCV3】旋转矩形(cv::RotateRect)的绘制_第3张图片



2017.04.11

你可能感兴趣的:(图像处理,OpenCV,机器视觉)