RotateRect(旋转矩形)的倾斜旋转变换矫正

在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();
}

原文地址:https://www.cnblogs.com/lx17746071609/p/11577246.html

时间: 2024-10-13 22:38:20

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

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

矢量标记语言 --- Vector Markup Language 运行它的代码需要打开IE的兼容性视图 如有疑问请参考:http://msdn.microsoft.com/en-us/library/bb264280(VS.85).aspx 代码如下: <html xmlns:v="urn:schemas-microsoft-com:vml"> <head> <!-- VML requires VML namespace and behavior. --

Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix

MainActivity如下: package cc.c; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; /** * Demo描述: * 利用B

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

MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.app.Activity; import android.graphics.Matrix; /** * Demo描述:

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

   1 :缩放        scale(x,y)函数让元素根据中心原点对对象进行缩放,大于1进行放大,小于1则缩小,如果为负值,则先进行翻转再进行缩放操作. 实例: HTML: <div class="old11"> <h3>原图</h3> <img src="http://images2015.cnblogs.com/blog/561794/201604/561794-20160412230412973-1641353956.j

Android进度条控制图片旋转&#183;平移&#183;缩放&#183;倾斜

初来乍到 平时代码多写于某笔记软件上 现在在这里记录一些 从初学Android开始写起 可能有些地方实现得略小白 或者还不能熟练使用博客园的功能 但是希望能够对需要的人有帮助 不足之处请多指教 一般使用工具:android studio 那么 Here we go. have a good time. 用进度条实现控制图片旋转·平移·缩放·倾斜 效果: 1 public class MainActivity extends AppCompatActivity implements SeekBar

【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

我们以cocos2dx lua脚本来说明,原理才是重点 检测圆和矩形碰撞,首先要找到矩形上离圆的中心点最近的点 if circle.x < box.x then cx = box.x end 如果圆在矩形的左边,离着圆中心点最近的矩形上的点在矩形的左边边界上 elseif circle.x > box.x + box.width then cx = box.x + box.width 如果圆的中心点在矩形的右边,离着圆中心点最近的矩形上的点在矩形的右边边界上 else cx = circle.

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

MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.app.Activity; import android.graphics.Matrix; /** * Demo描

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

在cocos2dx中进行矩形的碰撞检测时需要对旋转过的矩形做碰撞检查,由于游戏没有使用Box2D等物理引擎,所以采用了OBB(Oriented bounding box)方向包围盒算法,这个算法是基于SAT(Separating Axis Theorem)分离轴定律的. 分离轴定律:两个凸多边形物体,如果我们能找到一个轴,使得两个在物体在该轴上的投影互不重叠,则这两个物体之间没有碰撞发生,该轴为Separating Axis.也就是说两个多边形在所有轴上的投影都发生重叠,则判定为碰撞:否则,没有

车牌识别--倾斜矫正

在车牌识别系统中, 车牌字符能够正确分割的前提是车牌图像能够水平,以至于水平投影和垂直投影能够正常进行.如果车牌倾斜没有矫正,那么水平投影和垂直投影,甚至铆钉都无法正常处理.所以,当车辆信息中获取车牌的第一步,应该是检查倾斜角度,做倾斜矫正. 倾斜矫正,这里使用的算法: 1.倾斜角度检测: 霍夫变换 关于hough变换,可以参考前面图像处理博文: http://blog.csdn.net/liujia2100/article/details/6989693   直线检测 http://blog.