Polygons
-
說明:
Polygons
是一個用來表示多個多邊形的類別。這個類別提供了許多方法,用來操作多個多邊形的座標,例如:正規化座標、反正規化座標、裁剪多邊形、移動多邊形、縮放多邊形、轉換多邊形為凸多邊形、轉換多邊形為最小外接矩形、轉換多邊形為邊界框等等。 -
參數
- array (
_Polygons
):多個多邊形的座標。 - normalized (
bool
):是否為正規化多邊形的座標,是一個屬性標記。預設為False
。
- array (
-
屬性
- normalized:取得多邊形的正規化狀態。
- moments:取得多邊形的矩。
- area:取得多邊形的面積。
- arclength:取得多邊形的周長。
- centroid:取得多邊形的質心。
- boundingbox:取得多邊形的邊界框。
- min_circle:取得多邊形的最小外接圓。
- min_box:取得多邊形的最小外接矩形。
- orientation:取得多邊形的方向。
- min_box_wh:取得多邊形的最小外接矩形的寬高。
- extent:取得多邊形的占比。
- solidity:取得多邊形的實心度。
-
方法
- copy():複製多邊形物件。
- numpy():將多邊形物件轉換為 numpy 陣列。
- normalize(
w: float, h: float
):正規化多邊形的座標。 - denormalize(
w: float, h: float
):反正規化多邊形的座標。 - clip(
xmin: int, ymin: int, xmax: int, ymax: int
):裁剪多邊形。 - shift(
shift_x: float, shift_y: float
):移動多邊形。 - scale(
distance: int, join_style: JOIN_STYLE = JOIN_STYLE.mitre
):縮放多邊形。 - to_convexhull():將多邊形轉換為凸多邊形。
- to_min_boxpoints():將多邊形轉換為最小外接矩形的座標。
- to_box(
box_mode: str = 'xyxy'
):將多邊形轉換為邊界框。 - to_list(
flatten: bool = False
):將多邊形轉換為列表。 - is_empty(
threshold: int = 3
):判斷多邊形是否為空。
-
類別建構
- from_image(
image: np.ndarray, mode: int = cv2.RETR_EXTERNAL, method: int = cv2.CHAIN_APPROX_SIMPLE
):從影像中取得多邊形的座標。 - cat(
polygons_list: List["Polygons"]
):將多個多邊形列表串接成一個多邊形列表。
- from_image(
-
範例
import capybara as cb
polygons = cb.Polygons([
[[10., 20.], [50, 20.], [50, 80.], [10., 80.]],
[[60., 20.], [100, 20.], [100, 80.], [60., 80.]]
])
print(polygons)
# >>> Polygons(
# [
# Polygon([
# [10. 20.]
# [50. 20.]
# [50. 80.]
# [10. 80.]
# ]),
# Polygon([
# [60. 20.]
# [100. 20.]
# [100. 80.]
# [60. 80.]
# ])
# ]
# )
polygon1 = polygons.normalize(100, 100)
print(polygon1)
# >>> Polygons(
# [
# Polygon([
# [0.1 0.2]
# [0.5 0.2]
# [0.5 0.8]
# [0.1 0.8]
# ]),
# Polygon([
# [0.6 0.2]
# [1. 0.2]
# [1. 0.8]
# [0.6 0.8]
# ])
# ]
# )
polygon2 = polygons.denormalize(100, 100)
print(polygon2)
# >>> Polygons(
# [
# Polygon([
# [1000. 2000.]
# [5000. 2000.]
# [5000. 8000.]
# [1000. 8000.]
# ]),
# Polygon([
# [6000. 2000.]
# [10000. 2000.]
# [10000. 8000.]
# [6000. 8000.]
# ])
# ]
# )
polygon3 = polygons.clip(20, 20, 60, 60)
print(polygon3)
# >>> Polygons(
# [
# Polygon([
# [20. 20.]
# [50. 20.]
# [50. 60.]
# [20. 60.]
# ]),
# Polygon([
# [60. 20.]
# [60. 20.]
# [60. 60.]
# [60. 60.]
# ])
# ]
# )
polygon4 = polygons.shift(10, 10)
print(polygon4)
# >>> Polygons(
# [
# Polygon([
# [20. 30.]
# [60. 30.]
# [60. 90.]
# [20. 90.]
# ]),
# Polygon([
# [ 70. 30.]
# [110. 30.]
# [110. 90.]
# [ 70. 90.]
# ])
# ]
# )
polygon5 = polygons.scale(10)
print(polygon5)
# >>> Polygons(
# [
# Polygon([
# [ 0. 10.]
# [60. 10.]
# [60. 90.]
# [ 0. 90.]
# ]),
# Polygon([
# [ 50. 10.]
# [110. 10.]
# [110. 90.]
# [ 50. 90.]
# ])
# ]
# )
polygon6 = polygons.to_convexhull()
print(polygon6)
# >>> Polygons(
# [
# Polygon([
# [50. 80.],
# [10. 80.],
# [10. 20.],
# [50. 20.]
# ]),
# Polygon([
# [100. 80.],
# [ 60. 80.],
# [ 60. 20.],
# [100. 20.]
# ])
# ]
# )
polygon7 = polygons.to_min_boxpoints()
print(polygon7)
# >>> Polygons(
# [
# Polygon([
# [10. 20.]
# [50. 20.]
# [50. 80.]
# [10. 80.]
# ]),
# Polygon([
# [ 60. 20.]
# [100. 20.]
# [100. 80.]
# [ 60. 80.]
# ])
# ]
# )
polygon8 = polygons.to_boxes() # notice that the method name is different from Polygon
print(polygon8)
# >>> Boxes([[ 10. 20. 50. 80.], [ 60. 20. 100. 80.]]), BoxMode.XYXY
polygon9 = polygons.to_list()
print(polygon9)
# >>> [
# [
# [10.0, 20.0],
# [50.0, 20.0],
# [50.0, 80.0],
# [10.0, 80.0]
# ],
# [
# [60.0, 20.0],
# [100.0, 20.0],
# [100.0, 80.0],
# [60.0, 80.0]
# ]
# ]
polygon10 = polygons.is_empty()
print(polygon10)
# >>> [False, False]