首页 > 编程学习 > OpenCV:旋转矩形(RotatedRect)

OpenCV:旋转矩形(RotatedRect)

发布时间:2022/5/14 15:42:12

RotatedRect类是OpenCV的基础类,用于创建旋转矩形,下面是它的构造函数,包含旋转中心点、尺寸大小和旋转角度。

构造函数1: 

RotatedRect(const Point2f& center, const Size2f& size, float angle);
center旋转矩形的质心
size旋转矩形的宽度和高度
angle顺时针方向的旋转角度。当角度为0°,90°,180°,270°等时,矩形变为右上方的矩形

构造函数2: 

RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

通过这个构造函数也可以创建旋转矩形,只需要给出三个点,但是要指定三个点的顺序。

示例代码: 

#include <opencv2/opencv.hpp>
#include <iostream>

//宏定义
#define OPEN

int main()
{
	cv::Mat srcImage=cv::Mat(480,640,CV_8UC3,cv::Scalar(150,150,150));
#ifdef CLOSE
	cv::RotatedRect box(cv::Point(320, 240), cv::Size(200, 200), 30);
	cv::Point2f vertex[4];
	box.points(vertex);
#endif // CLOSE
#ifdef OPEN
	//随机数
	cv::RNG& rng = cv::theRNG();
	int count = rng.uniform(3,103);
	std::vector<cv::Point> points;
	for (int i=0;i<count;++i)
	{
		cv::Point point;
		point.x = rng.uniform(srcImage.cols / 4, srcImage.cols * 3 / 4);
		point.y = rng.uniform(srcImage.rows / 4, srcImage.rows * 3 / 4);
		points.push_back(point);
	}
	//获取点的最小包围旋转矩形
	cv::RotatedRect box=cv::minAreaRect(cv::Mat(points));
	cv::Point2f vertex[4];
	box.points(vertex);
	//绘制点
	for (int i=0;i<count;i++)
	{
		cv::circle(srcImage,points[i],3,cv::Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255)),cv::FILLED,8);
	}
#endif // OPEN
	//绘制旋转矩形
	for (int i = 0; i < 4; i++)
	{
		cv::line(srcImage, vertex[i], vertex[(i + 1) % 4], cv::Scalar(255, 100, 200),2,CV_AA);
	}
	std::cout << "center:" << box.center.x << "," << box.center.y << std::endl;
	std::cout << "Size:" << box.size.width << "," << box.size.height << std::endl;
	std::cout << "area:" << box.size.area()<<std::endl;
	std::cout << "angle:" << box.angle << std::endl;
	cv::imshow("srcImage", srcImage);
	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}

示例代码中用了条件编译,定义OPEN就是获取所有点的最小包围矩形,然后由最小包围矩形获取它的属性质心点、大小和角度;定义CLOSE就是直接使用质心点、大小和角度创建一个旋转矩形。

显示结果: 

Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000