|
|
import json |
|
|
import cv2 |
|
|
import os |
|
|
|
|
|
def get_visible_cell_coords(table_properties, table_x, table_y): |
|
|
rows = table_properties.get("rows", 0) |
|
|
columns = table_properties.get("columns", 0) |
|
|
column_widths = table_properties.get("columnWidths", {}) |
|
|
row_heights = table_properties.get("rowHeights", {}) |
|
|
merged_cells = table_properties.get("mergedCells", {}) |
|
|
hidden_cells = table_properties.get("hiddenCells", {}) |
|
|
|
|
|
DEFAULT_WIDTH = 100 |
|
|
DEFAULT_HEIGHT = 30 |
|
|
|
|
|
def get_col_width(col): |
|
|
return column_widths.get(str(col), DEFAULT_WIDTH) |
|
|
|
|
|
def get_row_height(row): |
|
|
return row_heights.get(str(row), DEFAULT_HEIGHT) |
|
|
|
|
|
|
|
|
merged_spanned_cells = set() |
|
|
for key, merge_info in merged_cells.items(): |
|
|
base_row, base_col = map(int, key.split('-')) |
|
|
rowspan = merge_info.get('rowspan', 1) |
|
|
colspan = merge_info.get('colspan', 1) |
|
|
for r in range(base_row, base_row + rowspan): |
|
|
for c in range(base_col, base_col + colspan): |
|
|
if (r, c) != (base_row, base_col): |
|
|
merged_spanned_cells.add((r, c)) |
|
|
|
|
|
result = {} |
|
|
|
|
|
for row in range(rows): |
|
|
for col in range(columns): |
|
|
coord_key = f"{row}-{col}" |
|
|
if hidden_cells.get(coord_key): |
|
|
continue |
|
|
if (row, col) in merged_spanned_cells: |
|
|
continue |
|
|
|
|
|
|
|
|
x = sum(get_col_width(c) for c in range(col)) |
|
|
y = sum(get_row_height(r) for r in range(row)) |
|
|
|
|
|
|
|
|
if coord_key in merged_cells: |
|
|
colspan = merged_cells[coord_key].get("colspan", 1) |
|
|
rowspan = merged_cells[coord_key].get("rowspan", 1) |
|
|
else: |
|
|
colspan = 1 |
|
|
rowspan = 1 |
|
|
|
|
|
width = sum(get_col_width(c) for c in range(col, col + colspan)) |
|
|
height = sum(get_row_height(r) for r in range(row, row + rowspan)) |
|
|
|
|
|
result[(row, col)] = { |
|
|
"x": int(x + table_x), |
|
|
"y": int(y + table_y), |
|
|
"width": int(width), |
|
|
"height": int(height) |
|
|
} |
|
|
|
|
|
return result |
|
|
|
|
|
folder_path = "/Users/tuvn18/Desktop/tuvn18/dev/KIAI/dev/trace/train_table_1209" |
|
|
save_folder = "cell_vis" |
|
|
os.makedirs(save_folder, exist_ok=True) |
|
|
for name in os.listdir(folder_path): |
|
|
if name.endswith("json"): |
|
|
json_file = os.path.join(folder_path, name) |
|
|
with open(json_file, "r") as f: |
|
|
data = json.load(f) |
|
|
|
|
|
img_name = name.split('.')[0] + ".png" |
|
|
print(img_name) |
|
|
image = cv2.imread(os.path.join(folder_path,img_name)) |
|
|
items = data.get('items') |
|
|
for index in range(len(items)): |
|
|
|
|
|
table = items[index] |
|
|
if table.get('type') != 'table': |
|
|
continue |
|
|
table_x = table.get('x') |
|
|
table_y = table.get('y') |
|
|
|
|
|
table_prob = table.get('properties') |
|
|
boxes = get_visible_cell_coords(table_prob, table_x, table_y) |
|
|
|
|
|
for key, box in boxes.items(): |
|
|
row, col = key |
|
|
x, y, w, h = int(box["x"]), int(box["y"]), int(box["width"]), int(box["height"]) |
|
|
|
|
|
top_left = (x, y) |
|
|
bottom_right = (x + w, y + h) |
|
|
|
|
|
cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv2.imwrite(os.path.join(save_folder, img_name), image) |