本文为作者原创,未经允许不得转载;

原文由作者发表在博客园: http://www.cnblogs.com/panxiaochun/p/5478555.html

关于cvBox2D和RotatedRect中返回的角度angle的opencv官方说明文档里面没有给出太多到信息,其中文档是这样说的:

图1:opencv关于cvBox2D的说明文档截图

在水平轴和第一条边之间的角度。(好简洁,但是真的并没有太明确)

在网上也有关于cvBox2D和RotatedRect的角度angle的说明,但是查看了一下,不对,或者不完全对。其中有两篇:http://blog.csdn.net/mine1024/article/details/6044856

http://blog.csdn.net/a553654745/article/details/45743063,其中说到了,x轴逆时针碰到的第一条边为width(实际中width可能比Height还大,实际使用中确实发现了width比height还大的情况),下面选取两篇文章中的图来说明一下:

图2:网友关于旋转角的说明图

这幅图是网上流传最多的,但是只有一篇原创,其它都是复制粘贴,有的甚至只是放了一幅图,这篇博文只告诉我们一个有用的东西,x轴逆时针碰到的第一条边为width,并与这条边形成的角度就是cvBox2D和RotatedRect的角度angle,但是这篇博文忽略了,一个事实就是opencv的坐标原点是左上角,所以这个坐标系是错的。下面的图就比较完整的说明了cvBox2D和RotatedRect的角度的来源:

图3:网友关于opencv旋转角的修正图

这个图是很好说明角度的选取的来源,但是我本人觉得有点错误所以,修正了一下:

图4:我个人关于cvBox2D和RotatedRect里面的角度angle的说明图

这是本人修改过的图,下面进入论证,这里用了一幅图,里面有两个旋转的矩形,其中由于旋转的角度不一样,所以opencv找出来的cvBox2D里面的width有可能会比height大

图5:测试图片里面的两个矩形图

其中第一个由于它是逆时针旋转的,所以,x轴会先碰到顶部的直线L1,第二个矩形是顺时针旋转的,所以x轴会先碰到左边的直线L2,很明显L2会比L1大,其中L1也会比它左边的直线小:

图6:第一个矩形的检测结果图

第一个矩形的角度只有-22度(再次证明不是书上说的弧度)其中width为130,比height小。

图7:第二个矩形的检测结果图

第二个矩形的角度为-77度,width为234,比height109大,其中还比第一个矩形的width大。论证成立。

其中角度的正负,在网上很多都说逆时针为正,顺时为负,这里逆时针为负,顺时针为正,主要原因,我个人觉得是和坐标系有关,因为网上说的角度的旋转的坐标系是以图2的坐标系作为参考,而opencv里面是以图3的作为参考,所以在x轴和y轴的象限里的角度为正的原则吧,opencv里逆时针为负。

图8:论证结果详解图

在opencv的源码的\modules\ imgproc\src下的rot calipers.cpp里可以找到minareaRect()函数的源码,该函数会返回RotatedRect,在c#版会返回CvBox2D,两个是一样的,在里面找到了angle不是弧度最佳证明:

box.angle = (float)(box.angle*180/CV_PI);

可以看出返回的RotatedRect的angle不是弧度单位,刚开始angle是弧度的,后来经过转换后再输出了,可能前几个版本里面的angle是弧度的后来改为度了。

cvBox2D和RotatedRect中返回的角度angle详解的更多相关文章

  1. 【Unity编程】Unity中关于四元数的API详解

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...

  2. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  3. JavaScript中的鼠标滚轮事件详解

    JavaScript中的鼠标滚轮事件详解/*Firefox注册事件*/ ~~~Firefox: addEventListener('DOMMouseScroll', handler, false)if ...

  4. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  5. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  6. php中的PDO函数库详解

    PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,P ...

  7. Java 中的异常和处理详解

    Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...

  8. 数据挖掘模型中的IV和WOE详解

    IV: 某个特征中 某个小分组的 响应比例与未响应比例之差 乘以 响应比例与未响应比例的比值取对数 数据挖掘模型中的IV和WOE详解 http://blog.csdn.net/kevin7658/ar ...

  9. Delphi中的线程类 - TThread详解

    Delphi中的线程类 - TThread详解 2011年06月27日 星期一 20:28 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本 ...

随机推荐

  1. JSON.stringify()、JSON.parse()和eval(string)

    1.JSON.stringify()用于从一个对象解析出字符串,eg: var obj = {"name":"奔跑的蜗牛","age":&q ...

  2. JavaScript学习笔记-基础语法、类型、变量

    基础语法.类型.变量   非数字值的判断方法:(因为Infinity和NaN他们不等于任何值,包括自身) 1.用x != x ,当x为NaN时才返回true; 2.用isNaN(x) ,当x为NaN或 ...

  3. js实现标准无缝滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. ABAP 一个隐藏 selection-screen block的实例

    以下是一个演示如何通过 selection-screen 中的pushbutton来动态改变屏幕上的字段的显示状态的(即显示或者隐藏).      注意:显示 通过本示例可知selection-scr ...

  5. FM四舍五入_从小数点最后一位进位

    原贴地址:http://jiahongguang12.blog.163.com/blog/static/334665720071060551591/ 输入参数12.5445,因此FM从小数点最后一位进 ...

  6. 如何编写Vault插件扩展Vault Explorer的功能

    今天练习了一下Vault Explorer的扩展程序,基本上是Vault SDK中的HelloWord示例程序.如果你刚刚开始接触Vault的二次开发,希望对你有帮助. 开始之前,你需要安装Vault ...

  7. 移动Web开发(二)

    这些天一直在忙iOS,Android和.Net方面的知识都有些忘记了,汗.不过还是先重温一下HTML吧,手动滑稽. 说实话前面的基础部分基本上大家都会,就当看个热闹吧. 1.HTML的核心要素--标签 ...

  8. iOS tableviewcell 分割线 偏移和颜色

    改变颜色 [_hotProductsTableView setSeparatorColor : kSeparatorColor]; -(void)viewDidLayoutSubviews { [su ...

  9. Android 数据库SQLite 写入SD卡

    如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...

  10. 9、数据库工程师要阅读的书籍 - IT软件人员书籍系列文章

    数据库设计是软件项目底层的工作,它关系到软件项目的基础内容设计问题.数据库工程师的工作,就是设计数据库,维护数据库,优化数据库,这个跟DBA数据库助手的工作类似.现在的数据库有好几种了,比如MS SQ ...