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就是直接使用质心点、大小和角度创建一个旋转矩形。
显示结果: