欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算不规则四边形(多边形)的面积

程序员文章站 2022-04-01 18:42:22
...

本文代码用于比较计算不规则四边形的面积的两种方法(海伦公式和向量积),因为本人最近在研究目标检测的问题,当标记目标是以不规则四边形标注或多边形时,需要基于此面积计算Recall,Precision,IoU来评价模型。

1. 海伦公式和向量积公式

海伦公式和向量积计算不规则四边形的面积,都是以计算三角形面积为基础。

海伦公式:(看代码)

向量积:https://blog.csdn.net/liyuanbhu/article/details/51921096

2.  海伦公式和向量积对比

向量积计算多边形可基于行列式的方法,计算量小且快,而海伦公式因为要计算根号(根号内还得大于等于0),所以其计算量较大。当然最重要的是向量积计算的结果更精确。

3. 向量积判断顺逆时针标注的坐标

基于向量积计算面积的正负,可判断标注坐标是顺时针(负)还是逆时针(正)。

4. 本文代码计算的是不规则四边形,小小的修改可计算多边形。

import numpy as np

# 计算欧式距离
def cal_distance(point1, point2):
    dis = np.sqrt(np.sum(np.square(point1[0]-point2[0])+np.square(point1[1]-point2[1])))
    return dis

# 基于海伦公式计算不规则四边形的面积
def helen_formula(coord):
    coord = np.array(coord).reshape((4,2))
    # 计算各边的欧式距离
    dis_01 = cal_distance(coord[0], coord[1])
    dis_12 = cal_distance(coord[1], coord[2])
    dis_23 = cal_distance(coord[2], coord[3])
    dis_31 = cal_distance(coord[3], coord[1])
    dis_13 = cal_distance(coord[0], coord[3])
    p1 = (dis_01+dis_12+dis_13)*0.5
    p2 = (dis_23+dis_31+dis_13)*0.5
    # 计算两个三角形的面积
    area1 = np.sqrt(p1*(p1-dis_01)*(p1-dis_12)*(p1-dis_13))
    area2 = np.sqrt(p2*(p2-dis_23)*(p2-dis_31)*(p2-dis_13))
    return area1+area2

# 基于向量积计算不规则四边形的面积
def vector_product(coord):
    coord = np.array(coord).reshape((4,2))
    temp_det = 0
    for idx in range(3):
        temp = np.array([coord[idx],coord[idx+1]])
        temp_det +=np.linalg.det(temp)
    temp_det += np.linalg.det(np.array([coord[-1],coord[0]]))
    return temp_det*0.5


coord = [2,2,4,2,4,4,2,4]
helen_result = helen_formula(coord)
vector_result = vector_product(coord)
print("the result of helen formula:", helen_result)
print("the result of vector product:", vector_result)

 

相关标签: 不规则四边形