OpenCV从3.2升级到4.6后RotatedRect结果倒置问题问询
OpenCV 3.2升至4.6后minAreaRect参数倒置的原因及兼容方案
为什么会出现参数倒置?
OpenCV在4.x版本中调整了minAreaRect的输出规则:
- 3.2(3.x系列)中,
RotatedRect的width ≥ height,角度范围是-90° < angle ≤ 0° - 4.6(4.x系列)中,规则变为width ≤ height,角度范围调整为
0° ≤ angle < 90°
你看到的结果是这个规则变化的直接体现:3.2里的793×23(宽×高)和-0.5°,在4.6里被描述为23×793,角度转换为90°+(-0.5°)=89.5°左右,两者对应的是同一个最小外接矩形,只是参数表述方式不同。
如何在少改代码的前提下兼容?
只需要添加一个转换函数,把4.6版本的RotatedRect参数转换回3.2的规则:
public static RotatedRect to3xRotatedRect(RotatedRect rect) { if (rect.size.width <= rect.size.height) { // 交换宽高,调整角度到3.x的范围 Size swappedSize = new Size(rect.size.height, rect.size.width); double adjustedAngle = rect.angle - 90.0; if (adjustedAngle <= -90.0) { adjustedAngle += 180.0; } return new RotatedRect(rect.center, swappedSize, adjustedAngle); } // 已经符合3.x规则,直接返回 return rect; }
使用时只需要在获取rotatedRect后调用这个转换:
matOfPoint = contours.get(i); MatOfPoint2f contour2f = new MatOfPoint2f(matOfPoint.toArray()); RotatedRect rotatedRect = Imgproc.minAreaRect(contour2f); // 转换为3.2版本的参数格式 rotatedRect = to3xRotatedRect(rotatedRect);
这样后续所有依赖rotatedRect的计算逻辑都不需要修改,就能和3.2版本的行为完全一致。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

