我正在做一个大项目,我们需要在我们的Java项目上将OpenCV从3.2升级到4.6.

使用完全相同的图像,我得到了颠倒的结果:

获取轮廓:

matOfPoint = contours.get(i);
MatOfPoint2f contour2f = new MatOfPoint2f(matOfPoint.toArray());
RotatedRect rotatedRect = Imgproc.minAreaRect(contour2f);

I OpenCV版本3.2的结果为rotatedRect:

{{485.0001220703125, 641.5073852539062} 793x23 * -0.5055378675460815}}

在版本4.6中:

{{485.0000915527344, 641.5073852539062} 23x793 * 89.49445343017578}}

为什么widthheightangles是颠倒的?

在这之后,我有一堆计算,我想避免对它们进行太多更改.

推荐答案

reason个不同的结果需要一些考古工作才能找到.OpenCV 3.2版本已经很旧了.从那时起,OpenCV的很多内部 struct 可能都得到了改进.我不认为doctor 规定了Angular 的范围或宽度和高度之间的关系.如果有人更改实现细节,那将是可以接受的.

不考虑从小数点第三位或第四位开始的差异,这两个表示法是100:

{{485.0001220703125, 641.5073852539062} 793x23 * -0.5055378675460815}}
{{485.0000915527344, 641.5073852539062} 23x793 * 89.49445343017578}}

(-0.5055) % 90 = 89.4945

90度是四分之一个转弯.四分之一圈相当于互换宽度和高度.

如果您需要一些规范的形式,交换大小和调整Angular 为正且小于90度.

或者更好的是,因为这可能会对Angular 接近0度的框产生抖动:将Angular 规范为-45度到+45度.如果您希望对象主要是轴对齐的,那么这样做是有意义的.

伪代码/Python:

old_angle = np.linspace(-90, +90, 7)
temp = old_angle + 45
quarter_turns = temp // 90 # division and floor
new_angle = temp % 90 - 45

# array([-90., -60., -30.,   0.,  30.,  60.,  90.]) # old_angle
# array([ -1.,  -1.,   0.,   0.,   0.,   1.,   1.]) # quarter_turns
# array([  0.,  30., -30.,   0.,  30., -30.,   0.]) # new_angle

...

if quarter_turns % 2 != 0: # single angle, not array
    height, width = width, height

Java相关问答推荐

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

Android视图覆盖不阻止点击它后面的控件

如何将kotlin代码转换为java

如何在Android上获取来电信息

Listview—在Android Java中正确链接项目时出错

在for—each循环中的AnimationTimer中的if语句'

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

springboot start loge change

如何让JFileChooser(DIRECTORIES_ONLY)从FolderName中的空白开始?

具有多种令牌类型和段的复杂Java 17正则表达式

这是什么Java构造`(InputStream Is)->;()->;{}`

Spring Data JPA慢慢地创建了太多非活动会话

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

如果第一位数字和最后一位数字相差超过一位,您将如何获得随机数?

从泛型枚举创建EnumMap

如何使JOOQ渐变脚本不重新创建表未更改的类?

在数组中查找素数时出现逻辑错误

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)

一条Java记录可以保存多少个字段?