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

来源:互联网 发布:太阳的后裔迷彩服淘宝 编辑:程序博客网 时间:2024/06/07 20:03

在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<cv::Point> 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);



从代码中可以看出,我们可以使用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));}


结果如下:



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

代码如下:

//获取旋转矩形的四个顶点cv::Point2f* vertices = new cv::Point2f[4];rotate_rect.points(vertices);std::vector<cv::Point> contour;for (int i = 0; i < 4; i++){contour.push_back(vertices[i]);}std::vector<std::vector<cv::Point>> contours;contours.push_back(contour);cv::drawContours(image, contours, 0, cv::Scalar(255, 255, 0), 1);


结果如下:




2017.04.11

0 0
原创粉丝点击