方法一:
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,...