常见的坐标框转换:
cxy_wh_2_bbox,cxy_wh_2_rect, rect_2_cxy_wh
预定义:
框坐标表示中 (x,y)为中心点坐标,(x1,y1)为左上角坐标,(x2,y2)为右下角坐标,w和h分别是宽和高,使用图像坐标系(x轴正方向向下,y轴正方向向右)
rect矩形框形式:
Cxy坐标形式:
bbox边界框形式:
一般方法:
def rect1_2_cxy_wh(rect): #将矩形框表示形式转换成坐标形式 输入rect为(x1,y1,w,h)
return np.array([rect[0]+rect[2]/2-1, rect[1]+rect[3]/2-1]), np.array([rect[2], rect[3]])# return ((x,y),(w,h)) 此处(x,y)为中心坐标
def cxy_wh_2_rect1(pos, sz): #将坐标转换成矩形框的表示形式 输入pos,sz = ((x,y),(w,h))
return np.array([pos[0]-sz[0]/2+1, pos[1]-sz[1]/2+1, sz[0], sz[1]])# return (x1,y1,w,h) 此处(x1,y1)为左上角坐标
def cxy_wh_2_bbox(cxy, wh): #将坐标转换成边界框 输入cxy,wh = ((x,y),(w,h))
return np.array([cxy[0]-wh[0]/2, cxy[1]-wh[1]/2, cxy[0]+wh[0]/2, cxy[1]+wh[1]/2])# return (x1,y1,x2,y2) 此处(x1,y1)为左上角坐标,此处(x2,y2)为右下角坐标
上面的类似 pos[0]-sz[0]/2+1的+1 -1 操作应该是取整操作,个人觉得可用//代替
对应使用的场景有:
target_pos, target_sz = rect1_2_cxy_wh(init_rect) #init_rect初始矩形框
bbox = cxy_wh_2_bbox(target_pos, window_sz) #Window_sz 边界框大小
res = [cxy_wh_2_rect1(target_pos, target_sz)] #target_sz 矩形框大小
在计算IoU时,一般就是转换成bbox的(x1,y1,x2,y2) 形式计算的
注意:
一般在转换成边界框bbox时,函数cxy_wh_2_bbox(pos,sz)中的sz是 windos_sz(具体情况具体分析)
说明:
笔者仅做学习笔记使用,若有错误,欢迎指正!