在Opencv中的图像处理中,经常要用到minAreaRect()函数求最小外接矩形,该函数的返回值就是一个RotatedRect类对象。

RotatedRect类定义如下:

class CV_EXPORTS RotatedRect
{
  public:
  //! various constructors
  RotatedRect();
  RotatedRect(const Point2f& center, const Size2f& size, float angle);
  RotatedRect(const CvBox2D& box);   //! returns 4 vertices of the rectangle
  void points(Point2f pts[]) const;
  //! returns the minimal up-right rectangle containing the rotated rectangle
  Rect boundingRect() const;
  //! conversion to the old-style CvBox2D structure
  operator CvBox2D() const;   Point2f center; //< the rectangle mass center
  Size2f size; //< width and height of the rectangle
  float angle; //< the rotation angle. When the angle is 0, 90, 180, 270 etc., the rectangle becomes an up-right rectangle.
};

类中定义了矩形的中心点center、尺寸size(包括width、height)、旋转角度angle共3个成员变量;

points()函数用于求矩形的4个顶点,boundingRect()函数求包含最小外接矩形的,与坐标轴平行(或垂直)的最小矩形。

正确理解这些变量在图形中的对应关系,是正确应用该类的基础。先上示意图:

根据上图,说明以下几点:

1.  Opencv采用通用的图像坐标系,左上角为原点O(0,0),X轴向右递增,Y轴向下递增,单位为像素。

2. 矩形4个顶点位置的确定,是理解其它各变量的基础,其中p[0]点是关键。

顶点p[0]的位置可以这样理解:

ⓐ 如果没有对边与Y轴平行,则Y坐标最大的点为p[0]点,如矩形(2)(3)(4);

ⓑ 如果有对边与Y轴平等,则有两个Y坐标最大的点,此时,取左侧的点为p[0]点,如矩形(1)。

3. p[0]~p[3]按顺时针次序依次排列。

4. p[0]到p[3]之间的距离宽width,其邻边为高height。

5. 角度angle以穿过p[0],且平行于X轴的直线为始边,按逆时针方向旋转到宽边p[0]p[3]所经过的角度,

取负值,取值范围为(-90, 0]。

6. 中心点center为矩形对角线的交点。

#include<opencv2/opencv.hpp>

using namespace std;

void main(){
string path = "";
Mat img = imread(path);
Mat img_gray;
cvtColor(img,img_gray,COLOR_BGR2GRAY);
Mat thresh_img(img.size(),CV_8UC1);
threshold(img_gray, thresh_img,230,255,THRESH_BINARY_INV); imshow("thresh",thresh_img);
waitKey(); vector<vector<Point>> contours;
findContours(thresh_img, contours,CV_RET_EXTERNAL,CV_CHAIN_APPROX_NONE);
RotatedRect mr = minAreaRect(Mat(contours[0]));
Mat Drawing(img.size(), img.type(), Scalar(255,255,255));
Point2f vectpoint[4];
mr.points(vectpoint);
for (int i = 0; i < 4; i++){
line(Drawing, vectpoint[(i+1)%4], Scalar(255,0,0),2);
}
imshow("drawing",Drawing);
waitkey(); float angle = 0.0;
Size si = mr.size;
if (mr.size.width <= mr.size.height){
angle = mr.angle + 90;
int tm = si.width;
si.width = si.height;
si.height = tm;
//swap(si.width, si.height);
} else {
angle = mr.angle;
}
Mat rotmat = getRotationMatrix2D(mr.center, angle, 1); Mat deal_img;
warpAffine(img, deal_img, rotmat, img.size(), CV_INTER_CUBIC); imshow("deal_img",deal_img);
waitkey();
gerRectSubpix(deal_img, si, mr.center, rRect);
imshow("截取的的矩形区域",rRect);
waitKey();
}

RotateRect(旋转矩形)的倾斜旋转变换矫正的更多相关文章

  1. html --- SVG --- javascript --- 旋转矩形

    可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML), 用于描述二维矢量图形的一种图形格式.SVG由W3C制定,是一个开放标准. 在 Inte ...

  2. CSS缩放函数, 旋转函数与倾斜函数

       1 :缩放        scale(x,y)函数让元素根据中心原点对对象进行缩放,大于1进行放大,小于1则缩小,如果为负值,则先进行翻转再进行缩放操作. 实例: HTML: <div c ...

  3. cocos2d 判断旋转矩形是否包含某个点

    本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧.不废话了. 如图所以,如果判断点P是否被矩形A所包含,非常容易.那么如果矩形A以中心点逆时 ...

  4. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  5. CSS3旋转缩放移动倾斜等效果——transform

    1.transform浏览器支持情况 也就是说目前不考虑老浏览器的话是不用加前缀的,感谢菜鸟教程:https://www.runoob.com/cssref/css3-pr-transform.htm ...

  6. Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...

  7. 旋转矩形碰撞检测 OBB方向包围盒算法

    在cocos2dx中进行矩形的碰撞检测时需要对旋转过的矩形做碰撞检查,由于游戏没有使用Box2D等物理引擎,所以采用了OBB(Oriented bounding box)方向包围盒算法,这个算法是基于 ...

  8. html --- VML --- javascript --- 旋转矩形

    矢量标记语言 --- Vector Markup Language 运行它的代码需要打开IE的兼容性视图 如有疑问请参考:http://msdn.microsoft.com/en-us/library ...

  9. opencv HSV找颜色,找轮廓用最小旋转矩形框出

    #include <opencv2/opencv.hpp> #include<iostream> #include<string> using namespace ...

随机推荐

  1. HDFS【hadoop3.1.3 windows开发环境搭建】

    目录 一.配置hadoop3.1.3 windows环境依赖 配置环境变量 添加到path路径 在cmd中测试 二.idea中的配置 创建工程/模块 添加pom.xml依赖 日志添加--配置log4j ...

  2. Spring的事务传播机制(通俗易懂)

    概述 Spring的事务传播机制有7种,在枚举Propagation中有定义. 1.REQUIRED PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就 ...

  3. 3.3 rust HashMap

    The type HashMap<K, V> stores a mapping of keys of type K to values of type V. It does this vi ...

  4. Linux:cp -rp

    cp -rp[原文件或目录] [目标文件或目录] -r   复制目录 - p   保留文件属性 范例: cp -r /yy/k /yy/u /mm 复制目录u和目录k到目录mm中 cp -r /yy/ ...

  5. 【Service】【Database】【MySQL】基础

    1. 概念 1.1. 作者:Unireg 1.2. MySQL AB --> MySQL Solaris:二进制版本: 1.3. 官方网站: MySQL: www.mysql.com Maria ...

  6. 【Office】【Excel】将多个工作薄合为一个工作薄

    前提:工作薄首行不能有合并的单元格 准备工作:将要合并的工作簿放在一个文件夹里面,文件夹中不能有乱七八糟的东西,只能有你要合并的工作薄 操作步骤:在此文件夹下创建Excel表格并打开,按下alt+F1 ...

  7. hbuilder打包app基本流程

    声明:本文可能用到一些工具和第三方网站,都是为了达到目的而使用的工具,绝不含有广告成分 1.下载.最新的Hbuilder X貌似不能直接创建移动app了(自己不会用),建议旧版.可去腾某讯软件中心下载 ...

  8. Sql 查询语句优化

    sql查询很慢,很多时候并不是数据量大,而是sql语法使用不正确,本文讲述了基础语法使用,避免一些不必要的坑. explain select * from user;--查询执行时间 目录 Sql 优 ...

  9. 【论文笔记】 Denoising Implicit Feedback for Recommendation

    Denoising Implicit Feedback for Recommendation Authors: 王文杰,冯福利,何向南,聂礼强,蔡达成 WSDM'21 新加坡国立大学,中国科学技术大学 ...

  10. Python小组作业:基于yolov5的口罩佩戴识别

    Python老师给了三个小组项目:1.自身专业问题 2.人工智能 3.游戏或者小工具 提前告知了,写游戏不好拿高分,小工具又不能展示自己的水平.大一刚来也没碰到什么专业问题,于是经过讨论,决定了做人工 ...