关于RotatedRect中返回的角度angle的opencv官方说明文档里面没有给出太多到信息,但在python opencv关于该函数有详细的介绍:
在了解 RotatedRect中返回的角度angle之前,必须弄清楚的一件事是opencv图像坐标系的选取原则,在opencv中,图像的的坐标原点是左上角,以水平向右为X轴,以竖直向下为Y轴。而以往网上的资料都是建立在坐标原点是左下角,以水平向右为X轴,以竖直向上为Y轴,这对于大部分了解opencv的学习者来说,难以被接受,如图所示。
在了解OpenCV坐标系的选取规则之后,接下来我们就来讲讲有关RotatedRect中返回的角度angle的问题,具体的操作流程可参考https://www.cnblogs.com/panxiaochun/p/5478555.html,该文章详细的介绍了关于该角度angle的问题,但美中不足的是并没有得到一个比较令人通俗易懂的结论,在这里经过多次的论证,得出以下结论:
一、组成angel的最小外接矩形的边的选取问题。
angel的形成与选取的最小外接矩形的边有关,在这里我们只给出最终结论,有兴趣的同志,可以自己去验证一下,距离坐标原点最近的最小外接矩形的边,作为angel的一条边或者其延长线,而另一条边为X轴,两条线最终形成一个夹角。如图所示
二、angel角度正负的问题。
关于角度正负的问题,在OpenCV4.0官方文档中有详细的介绍,取值范围为[-90,0],至于为什么是这个角度范围,我个人理解是在X轴上方的均为负值,在X轴下方的均为正值,这样就不用去管什么逆时针旋转,顺时针旋转的问题,而对于RotatedRect中返回的角度angle的取值范围也就容易理解了。
三、angel角度的单位问题
在opencv的源码的\modules\ imgproc\src下的rot calipers.cpp里可以找到minareaRect()函数的源码,该函数会返回RotatedRect,在c#版会返回CvBox2D,两个是一样的,在里面找到了angle不是弧度最佳证明:
box.angle = (float)(box.angle*180/CV_PI);
可以看出返回的RotatedRect的angle不是弧度单位,刚开始angle是弧度的,后来经过转换后再输出了,可能前几个版本里面的angle是弧度的后来改为度了。