任意兩個旋轉矩形的IOU計算方法

2021-09-25 11:42:53 字數 3244 閱讀 9126

方法一:

import cv2

import numpy as np

image = cv2.imread('。。/downloads/timg.jpeg')

original_grasp_bboxes = np.array([[[361, 260.582 ], [301 ,315], [320 ,336],[380, 281.582]]], dtype = np.int32)

prediction_grasp_bboxes = np.array([[[301, 290.582 ], [321 ,322], [310 ,346],[380, 291.582]]], dtype = np.int32)

im = np.zeros(image.shape[:2], dtype = "uint8")

im1 =np.zeros(image.shape[:2], dtype = "uint8")

original_grasp_mask = cv2.fillpoly(im, original_grasp_bboxes, 255)

prediction_grasp_mask = cv2.fillpoly(im1,prediction_grasp_bboxes,255)

masked_and = cv2.bitwise_and(original_grasp_mask,prediction_grasp_mask , mask=im)

masked_or = cv2.bitwise_or(original_grasp_mask,prediction_grasp_mask)

or_area = np.sum(np.float32(np.greater(masked_or,0)))

and_area =np.sum(np.float32(np.greater(masked_and,0)))

iou = and_area/or_area

print(or_area)

print(and_area)

print(iou)

方法二:

# 中心點 矩形的w h, 旋轉的theta(角度,不是弧度)

def iou_rotate_calculate(boxes1, boxes2):

area1 = boxes1[:, 2] * boxes1[:, 3]

area2 = boxes2[:, 2] * boxes2[:, 3]

ious =

for i, box1 in enumerate(boxes1):

temp_ious =

r1 = ((box1[0], box1[1]), (box1[2], box1[3]), box1[4])

for j, box2 in enumerate(boxes2):

r2 = ((box2[0], box2[1]), (box2[2], box2[3]), box2[4])

int_pts = cv2.rotatedrectangleintersection(r1, r2)[1]

if int_pts is not none:

order_pts = cv2.convexhull(int_pts, returnpoints=true)

int_area = cv2.contourarea(order_pts)

inter = int_area * 1.0 / (area1[i] + area2[j] - int_area)

else:

return np.array(ious, dtype=np.float32)

方法三:

import numpy as np 

import shapely

from shapely.geometry import polygon,multipoint #多邊形

line1=[2,0,2,2,0,0,0,2] #四邊形四個點座標的一維陣列表示,[x,y,x,y....]

a=np.array(line1).reshape(4, 2) #四邊形二維座標表示

poly1 = polygon(a).convex_hull #python四邊形物件,會自動計算四個點,最後四個點順序為:左上 左下 右下 右上 左上

print(polygon(a).convex_hull) #可以列印看看是不是這樣子

line2=[1,1,4,1,4,4,1,4]

b=np.array(line2).reshape(4, 2)

poly2 = polygon(b).convex_hull

print(polygon(b).convex_hull)

union_poly = np.concatenate((a,b)) #合併兩個box座標,變為8*2

#print(union_poly)

print(multipoint(union_poly).convex_hull) #包含兩四邊形最小的多邊形點

if not poly1.intersects(poly2): #如果兩四邊形不相交

iou = 0

else:

try:

inter_area = poly1.intersection(poly2).area #相交面積

print(inter_area)

#union_area = poly1.area + poly2.area - inter_area

union_area = multipoint(union_poly).convex_hull.area

print(union_area)

if union_area == 0:

iou= 0

#iou = float(inter_area) / (union_area-inter_area) #錯了

iou=float(inter_area) / union_area

# iou=float(inter_area) /(poly1.area+poly2.area-inter_area)

# 原始碼中給出了兩種iou計算方式,第一種計算的是: 交集部分/包含兩個四邊形最小多邊形的面積

# 第二種: 交集 / 並集(常見矩形框iou計算方式)

except shapely.geos.topologicalerror:

print('shapely.geos.topologicalerror occured, iou set to 0')

iou = 0

print(a)

如何計算兩個矩形框的IoU

由於最近跟別人說我搞過目標檢測,然後被問到乙個問題,如何計算兩個矩形框的iou?一開始我回答說可以採用opencv的 運算和 運算來計算iou,但他要我不採用opencv 的介面,自己寫。當時我回答的比較亂,分4種情況進行討論2個矩形框之間的位置關係,最後他告訴我說,根本不需要討論,採用max mi...

兩個矩形的交並比(IOU)

由於最近的專案裡面要用到,雖然是個小東西,但還是來記錄一下.現在我們知道矩形t的左下角座標 x0,y0 右上角座標 x1,y1 矩形g的左下角座標 a0,b0 右上角座標 a1,b1 這裡我們可以看到area roit 跟arae roig 在確定座標而不確定兩個矩形是否相交的情況下,為已知的常量 ...

計算兩個向量之間的旋轉矩陣

為了更好地推導,我們需要加入三個軸對齊的單位向量i,j,k。i,j,k滿足以下特點 i jxk j kxi k ixj kxj i ixk j jxi k ixi jxj kxk 0 0是指0向量 由此可知,i,j,k是三個相互垂直的向量。它們剛好可以構成乙個座標系。這三個向量的特例就是i 1,0,...