mirror of
https://github.com/leigest519/ScreenCoder.git
synced 2026-02-13 18:22:50 +00:00
122 lines
4.3 KiB
Python
122 lines
4.3 KiB
Python
import numpy as np
|
|
import detect_compo.lib_ip.ip_draw as draw
|
|
|
|
|
|
class Bbox:
|
|
def __init__(self, col_min, row_min, col_max, row_max):
|
|
self.col_min = col_min
|
|
self.row_min = row_min
|
|
self.col_max = col_max
|
|
self.row_max = row_max
|
|
|
|
self.width = col_max - col_min
|
|
self.height = row_max - row_min
|
|
self.box_area = self.width * self.height
|
|
|
|
def put_bbox(self):
|
|
return self.col_min, self.row_min, self.col_max, self.row_max
|
|
|
|
def bbox_cal_area(self):
|
|
self.box_area = self.width * self.height
|
|
return self.box_area
|
|
|
|
def bbox_relation(self, bbox_b):
|
|
"""
|
|
:return: -1 : a in b
|
|
0 : a, b are not intersected
|
|
1 : b in a
|
|
2 : a, b are identical or intersected
|
|
"""
|
|
col_min_a, row_min_a, col_max_a, row_max_a = self.put_bbox()
|
|
col_min_b, row_min_b, col_max_b, row_max_b = bbox_b.put_bbox()
|
|
|
|
# if a is in b
|
|
if col_min_a > col_min_b and row_min_a > row_min_b and col_max_a < col_max_b and row_max_a < row_max_b:
|
|
return -1
|
|
# if b is in a
|
|
elif col_min_a < col_min_b and row_min_a < row_min_b and col_max_a > col_max_b and row_max_a > row_max_b:
|
|
return 1
|
|
# a and b are non-intersect
|
|
elif (col_min_a > col_max_b or row_min_a > row_max_b) or (col_min_b > col_max_a or row_min_b > row_max_a):
|
|
return 0
|
|
# intersection
|
|
else:
|
|
return 2
|
|
|
|
def bbox_relation_nms(self, bbox_b, bias=(0, 0)):
|
|
'''
|
|
Calculate the relation between two rectangles by nms
|
|
:return: -1 : a in b
|
|
0 : a, b are not intersected
|
|
1 : b in a
|
|
2 : a, b are intersected
|
|
'''
|
|
col_min_a, row_min_a, col_max_a, row_max_a = self.put_bbox()
|
|
col_min_b, row_min_b, col_max_b, row_max_b = bbox_b.put_bbox()
|
|
|
|
bias_col, bias_row = bias
|
|
# get the intersected area
|
|
col_min_s = max(col_min_a - bias_col, col_min_b - bias_col)
|
|
row_min_s = max(row_min_a - bias_row, row_min_b - bias_row)
|
|
col_max_s = min(col_max_a + bias_col, col_max_b + bias_col)
|
|
row_max_s = min(row_max_a + bias_row, row_max_b + bias_row)
|
|
w = np.maximum(0, col_max_s - col_min_s)
|
|
h = np.maximum(0, row_max_s - row_min_s)
|
|
inter = w * h
|
|
area_a = (col_max_a - col_min_a) * (row_max_a - row_min_a)
|
|
area_b = (col_max_b - col_min_b) * (row_max_b - row_min_b)
|
|
iou = inter / (area_a + area_b - inter)
|
|
ioa = inter / self.box_area
|
|
iob = inter / bbox_b.box_area
|
|
|
|
if iou == 0 and ioa == 0 and iob == 0:
|
|
return 0
|
|
|
|
# import lib_ip.ip_preprocessing as pre
|
|
# org_iou, _ = pre.read_img('uied/data/input/7.jpg', 800)
|
|
# print(iou, ioa, iob)
|
|
# board = draw.draw_bounding_box(org_iou, [self], color=(255,0,0))
|
|
# draw.draw_bounding_box(board, [bbox_b], color=(0,255,0), show=True)
|
|
|
|
# contained by b
|
|
if ioa >= 1:
|
|
return -1
|
|
# contains b
|
|
if iob >= 1:
|
|
return 1
|
|
# not intersected with each other
|
|
# intersected
|
|
if iou >= 0.02 or iob > 0.2 or ioa > 0.2:
|
|
return 2
|
|
# if iou == 0:
|
|
# print('ioa:%.5f; iob:%.5f; iou:%.5f' % (ioa, iob, iou))
|
|
return 0
|
|
|
|
def bbox_cvt_relative_position(self, col_min_base, row_min_base):
|
|
'''
|
|
Convert to relative position based on base coordinator
|
|
'''
|
|
self.col_min += col_min_base
|
|
self.col_max += col_min_base
|
|
self.row_min += row_min_base
|
|
self.row_max += row_min_base
|
|
|
|
def bbox_merge(self, bbox_b):
|
|
'''
|
|
Merge two intersected bboxes
|
|
'''
|
|
col_min_a, row_min_a, col_max_a, row_max_a = self.put_bbox()
|
|
col_min_b, row_min_b, col_max_b, row_max_b = bbox_b.put_bbox()
|
|
col_min = min(col_min_a, col_min_b)
|
|
col_max = max(col_max_a, col_max_b)
|
|
row_min = min(row_min_a, row_min_b)
|
|
row_max = max(row_max_a, row_max_b)
|
|
new_bbox = Bbox(col_min, row_min, col_max, row_max)
|
|
return new_bbox
|
|
|
|
def bbox_padding(self, image_shape, pad):
|
|
row, col = image_shape[:2]
|
|
self.col_min = max(self.col_min - pad, 0)
|
|
self.col_max = min(self.col_max + pad, col)
|
|
self.row_min = max(self.row_min - pad, 0)
|
|
self.row_max = min(self.row_max + pad, row) |