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();
- }
RotateRect(旋转矩形)的倾斜旋转变换矫正的更多相关文章
- html --- SVG --- javascript --- 旋转矩形
可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML), 用于描述二维矢量图形的一种图形格式.SVG由W3C制定,是一个开放标准. 在 Inte ...
- CSS缩放函数, 旋转函数与倾斜函数
1 :缩放 scale(x,y)函数让元素根据中心原点对对象进行缩放,大于1进行放大,小于1则缩小,如果为负值,则先进行翻转再进行缩放操作. 实例: HTML: <div c ...
- cocos2d 判断旋转矩形是否包含某个点
本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧.不废话了. 如图所以,如果判断点P是否被矩形A所包含,非常容易.那么如果矩形A以中心点逆时 ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- CSS3旋转缩放移动倾斜等效果——transform
1.transform浏览器支持情况 也就是说目前不考虑老浏览器的话是不用加前缀的,感谢菜鸟教程:https://www.runoob.com/cssref/css3-pr-transform.htm ...
- Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...
- 旋转矩形碰撞检测 OBB方向包围盒算法
在cocos2dx中进行矩形的碰撞检测时需要对旋转过的矩形做碰撞检查,由于游戏没有使用Box2D等物理引擎,所以采用了OBB(Oriented bounding box)方向包围盒算法,这个算法是基于 ...
- html --- VML --- javascript --- 旋转矩形
矢量标记语言 --- Vector Markup Language 运行它的代码需要打开IE的兼容性视图 如有疑问请参考:http://msdn.microsoft.com/en-us/library ...
- opencv HSV找颜色,找轮廓用最小旋转矩形框出
#include <opencv2/opencv.hpp> #include<iostream> #include<string> using namespace ...
随机推荐
- win32汇编基础
win32汇编基础知识 Debug 版本|Release 版本 Debug 是"调试"的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助 ...
- 【leetocde】922. Sort Array By Parity II
Given an array of integers nums, half of the integers in nums are odd, and the other half are even. ...
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍
其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...
- 【C/C++】最长无重复子数组
题目描述 给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同. 子数组是连续的,比如[1,2,3,4,5]的子数组有[1,2],[2,3,4]等等,但是[1,3, ...
- 【阿菜做实践】利用go语言写一个简单的Pow样例
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...
- 加密解密、食谱、新冠序列,各种有趣的开源项目Github上都有
Github上是我们程序员学习开源代码.提升编程技巧的好地方.好学校,但是除了学习,小伙伴们有没有发现过Github上一些特别有意思的项目呢? 今天TJ君就来和大家分享几个自认为特别有趣的开源项目: ...
- 『学了就忘』Linux服务管理 — 79、源码包安装的服务管理
目录 1.源码包服务的启动管理 2.源码包服务的自启动管理 3.让源码包服务被服务管理命令识别 1.源码包服务的启动管理 # 通过源码包的安装路径,找到该服务的启动脚本, # 也就是获得该服务的启动脚 ...
- Wireshark(四):网络性能排查之TCP重传与重复ACK
原文出处: EMC中文支持论坛 作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端.但用户感到网络运行缓慢并不意味着就是网络问题. 解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重 ...
- Python pyecharts绘制饼图
一.pyecharts绘制饼图语法简介 饼图主要用于表现不同类目的数据在总和中的占比.每个的弧度不是数据量的占比pie.add()方法的用法add(name, attr, value, radius= ...
- 成本计划的输出(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 所谓"输出"就是把数据摆出来让人看,好吧,这种"看",可以直接在屏幕上看,也可以打 ...