91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用python在2D中計算多邊形IoU

發布時間:2022-02-23 10:33:47 來源:億速云 閱讀:202 作者:iii 欄目:開發技術

這篇文章主要介紹了怎么使用python在2D中計算多邊形IoU的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用python在2D中計算多邊形IoU文章都會有所收獲,下面我們一起來看看吧。

  1. 假設每個多邊形的點是順時針在圓圈中排列的。如果我們發現簽名區域為負值,我們可以通過增加角度 w.r.t x 軸或倒車點來確保這一點。

  2. 將兩個多邊形的點合并到單個列表中,跟蹤每個點屬于哪個多邊形。我們還需要能夠確定每個點在原始多邊形中的上一點和下一點。L

  3. 通過增加角度來排序w.r.t x軸。L

  4. 如果輸入多邊形相交,則從一個多邊形到另一個多邊形的過渡次數將大于兩個。L

  5. 遍歷。如果連續點屬于不同的多邊形,則第一點與其下一點和第二點之間的線的交叉點及其前一點將屬于兩個多邊形之間的交點。L

  6. 將步驟 4 中確定的每個點添加到新的多邊形中。將按順序遇到積分。II

  7. 每個多邊形的面積之和將等于其聯盟加上交叉口的區域,因為這將計算兩次。

  8. 因此,將的價值由兩個多邊形的面積之和減去面積之和來表示。IoUII

唯一需要的幾何形狀是使用Shoelace 公式計算簡單多邊形的面積,并確定步驟 5 所需的兩條線段之間的交匯點。

這里有一些Java代碼(Ideone)來說明 - 你也許可以使它在Python更緊湊。

double[][] coords = {{-0.708, 0.707, 0.309, -0.951, 0.587, -0.809},
                       {1, 0, 0, 1, -1, 0, 0, -1, 0.708, -0.708}};

double areaSum = 0;
List<CPoint> pts = new ArrayList<>();
for(int p=0; p<coords.length; p++)
{
    List<CPoint> poly = new ArrayList<>();
    for(int j=0; j<coords[p].length; j+=2)
    {
        poly.add(new CPoint(p, coords[p][j], coords[p][j+1]));
    }
    
    double area = area(poly);
    if(area < 0)
    {
        area = -area;
        Collections.reverse(poly);
    }
    areaSum += area;
    
    pts.addAll(poly);

    int n = poly.size();
    for(int i=0, j=n-1; i<n; j=i++)
    {
        poly.get(i).prev = poly.get(j);
        poly.get(j).next = poly.get(i);             
    }
}       
        
pts.sort((a, b) -> Double.compare(a.theta, b.theta));
        
List<Point2D> intersections = new ArrayList<>();
int n = pts.size();
for(int i=0, j=n-1; i<n; j=i++)
{
    if(pts.get(j).id != pts.get(i).id)
    {
        intersections.add(intersect(pts.get(j), pts.get(j).next, pts.get(i).prev, pts.get(i)));
    }
}

double areaInt = area(intersections);
double iou = areaInt/(areaSum - areaInt);
System.out.println(iou);

輸出:

0.12403616470027268

和支持代碼:

static class CPoint extends Point2D.Double
{
    int id;
    double theta;
    CPoint prev, next;
    
    public CPoint(int id, double x, double y)
    {
        super(x, y);
        this.id = id;
        theta = Math.atan2(y, x);
        if(theta < 0) theta = 2*Math.PI + theta;
    }
}   

static double area(List<? extends Point2D> poly)
{
    double area = 0;
    for(int i=0, j=poly.size()-1; i<poly.size(); j=i++)
        area += (poly.get(j).getX() * poly.get(i).getY()) - (poly.get(i).getX() * poly.get(j).getY());
    return Math.abs(area)/2;
}

// https://rosettacode.org/wiki/Find_the_intersection_of_two_lines#Java
static Point2D intersect(Point2D p1, Point2D p2, Point2D p3, Point2D p4)
{
  double a1 = p2.getY() - p1.getY();
  double b1 = p1.getX() - p2.getX();
  double c1 = a1 * p1.getX() + b1 * p1.getY();

  double a2 = p4.getY() - p3.getY();
  double b2 = p3.getX() - p4.getX();
  double c2 = a2 * p3.getX() + b2 * p3.getY();

關于“怎么使用python在2D中計算多邊形IoU”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用python在2D中計算多邊形IoU”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉环县| 清丰县| 鹤山市| 垦利县| 成安县| 平江县| 大新县| 临沧市| 丽江市| 景德镇市| 南通市| 南和县| 固原市| 睢宁县| 贵南县| 池州市| 盐津县| 大宁县| 扶沟县| 资阳市| 平罗县| 丰宁| 应用必备| 合江县| 贞丰县| 库尔勒市| 平山县| 门源| 陈巴尔虎旗| 怀安县| 高清| 南部县| 娄底市| 宁都县| 新闻| 庆城县| 开远市| 确山县| 凉城县| 两当县| 芦溪县|