當我跑步時:
@Test
public void funkyTriangleContour2_forStack_works() {
final var points = new Point[]{new Point(), new Point(1, 0), new Point(1, 2)};
final var contour = new MatOfPoint2f(points);
final var minRect = Imgproc.minAreaRect(contour);
System.out.println("center: " minRect.center);
System.out.println("rotation: " minRect.angle);
System.out.println("width: " minRect.size.width " height: " minRect.size.height);
assertThat(minRect.size.area(), is(lessThan(2.0)));
assertThat(minRect.size.area(), is(greaterThan(1.0)));
}
它通過并給出:
center: {0.9000000953674316, 0.800000011920929}
rotation: 63.43495178222656
width: 2.2360680103302 height: 0.8944271206855774
但是當我改變不應該改變最小邊界矩形的點的順序時,我得到了不同的答案:
@Test
public void funkyTriangleContour2_forStack_fails() {
final var points = new Point[]{new Point(1, 0), new Point(1, 2), new Point()};
final var contour = new MatOfPoint2f(points);
final var minRect = Imgproc.minAreaRect(contour);
System.out.println("center: " minRect.center);
System.out.println("rotation: " minRect.angle);
System.out.println("width: " minRect.size.width " height: " minRect.size.height);
assertThat(minRect.size.area(), is(lessThan(2.0)));
assertThat(minRect.size.area(), is(greaterThan(1.0)));
}
它失敗并給出:
center: {0.5, 1.0}
rotation: 90.0
width: 2.0 height: 1.0
我對例程的理解是它給出了一個可以旋轉的邊界矩形以保持它包含所有點的小,所以點的順序應該無關緊要。即使它指的是輪廓,旋轉點也不應該改變結果。
知道為什么這樣做嗎?
謝謝
uj5u.com熱心網友回復:
這個問題實際上有兩種不同的解決方案,如下圖所示:

到斜邊h的高度在哪里,它的公式是。 p qh = (a * b) / (p q)
如果我們稍微重新排列一下,我們會得到h * (p q) = a * b——左側現在代表綠色矩形的區域,右側代表紅色矩形的區域。因此,兩個矩形的面積相同。
您看到的差異是由浮點數的精度有限引起的。
我沒有研究演算法,但似乎提供點的順序決定了選擇可能的多個解決方案中的哪一個,進而決定了錯誤是否會累積以及累積了多少(或者僅僅是由于無法表示而引起的)解決方案的所有引數準確)。
事實上,事實證明該演算法在 OpenCV 的歷史中被多次修改——我能夠從 3 個不同版本的 OpenCV 中獲得 3 個不同的結果,對于相同順序的完全相同的點。這里的部分問題還在于,有多種方法可以使用 5 元組 OpenCV 來描述同一個矩形(我通過寬度、高度和旋轉角度看到了 4)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536323.html
標籤:爪哇打开简历几何学
上一篇:代碼生成器(CodeBuilder) 2.9.4 穩定版
下一篇:如何隔離這些影像中的電容器?
