bitmap是网络求出的分数图,
_box是多边形位置坐标。
(1)先求出box所在的最小外接矩形位置(xmin, ymin, ymin, ymax);
(2)生成此外接矩形大小的mask;
(3)为了在此mask填充box多边形,需要将box移动到左上角;
(4)在bitmap裁剪对应的外接矩形,再与mask对应起来求均值。
def box_score_fast(bitmap, _box):
"""
在bitmap分数图上,求多边形box位置上的平均值。
Args:
bitmap: score map
_box: loc. (num, 2). 字符轮廓点集: [[x,y], [x,y], ...]
eg. [[166 963], [171 979], [488 968], [479 956], [178 955]]
Returns:
"""
h, w = bitmap.shape[:2]
box = _box.copy()
xmin = np.clip(np.floor(box[:, 0].min()).astype(np.int32), 0, w - 1) # 左上
xmax = np.clip(np.ceil(box[:, 0].max()).astype(np.int32), 0, w - 1)
ymin = np.clip(np.floor(box[:, 1].min()).astype(np.int32), 0, h - 1) # 右下
ymax = np.clip(np.ceil(box[:, 1].max()).astype(np.int32), 0, h - 1)
mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8) # box大小的mask,此时mask左上边坐标是(0,0)
box[:, 0] = box[:, 0] - xmin # box位置整体向左平移
box[:, 1] = box[:, 1] - ymin # box位置整体向上平移。这样box的位置也是相对于(0,0)开始的。
cv2.fillPoly(mask, box.reshape(1, -1, 2).astype(np.int32), 1) # 在mask图上box位置填充1.
return cv2.mean(bitmap[ymin:ymax + 1, xmin:xmax + 1], mask)[0] # roi bitmap + mask
参考:mmocr/models/textdet/postprocess/utils.py