【opencv】cv2.minAreaRect()内部实现算法分析

opencv里求最小外接矩形的函数是cv2.minAreaRect()
OpenCV中minAreaRect()最小外接矩形详解

minAreaRect()内部实现思路:

1. 先求轮廓点集的凸包convex hull

关于凸包convex hull:
凸包维基百科
凸包算法维基百科
关于凸包算法
opencv里求凸包的函数是convexHull(),其用的算法是Sklansky算法
其他的凸包算法:
Learn OpenCV之Convex Hull
凸包问题的五种解法
数学:凸包算法详解

2. 再求凸包的最小外接矩形

几何定理:多边形的最小外接矩形的一条边必然与多边形的其中一条边共线

旋转卡尺算法Rotating calipers
根据上面的定理,只需要枚举多边形的边,做外接矩形,比较外接矩的面积,选最小的那个。(因为是矩形,所以枚举旋转超过90度结束,之后的枚举都是重复的外接矩形)
旋转卡壳算法详解

opencv里的函数:rotatingCalipers()

rotatingCalipers( hpoints, n, CALIPERS_MINAREARECT, (float*)out );
box.center.x = out[0].x + (out[1].x + out[2].x)*0.5f;
box.center.y = out[0].y + (out[1].y + out[2].y)*0.5f;
box.size.width = (float)std::sqrt((double)out[1].x*out[1].x + (double)out[1].y*out[1].y);
box.size.height = (float)std::sqrt((double)out[2].x*out[2].x + (double)out[2].y*out[2].y);
box.angle = (float)atan2( (double)out[1].y, (double)out[1].x );
 //	    				((CvPoint2D32f*)out)[0] - corner
 //                    ((CvPoint2D32f*)out)[1] - vector1 based on out[0]
 //                    ((CvPoint2D32f*)out)[2] - vector2 based on out[0]
 //
 //                      ^
 //                      |
 //              vector2 |
 //                      |
 //                      |____________\
 //                    corner         /
 //                               vector1

最小外接矩形的另一种实现思路

虽然最小外接矩形minAreaRect在很大的程度上可以代表物体的方向性,即,oriented bounding box
但是,还有一种OBB的实现思路,来源https://www.cnblogs.com/jsxyhelu/p/9345590.html
1,PCA主成分分析得到物体的主方向
2. 旋转物体的主方向,使其正交与坐标系,此时再求旋转后的up-right bounding box
3. 求得bbox后,再旋转回去,此时的bbox变为了obb

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值