57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Regenerate debug_clusters.png with the new split bubbles.json
|
|
"""
|
|
|
|
import json
|
|
import cv2
|
|
import numpy as np
|
|
|
|
def quad_bbox(quad):
|
|
"""Convert quad to bounding box"""
|
|
xs = [p[0] for p in quad]
|
|
ys = [p[1] for p in quad]
|
|
return (min(xs), min(ys), max(xs), max(ys))
|
|
|
|
def save_debug_clusters_from_json(
|
|
image_path="004.png",
|
|
bubbles_path="bubbles.json",
|
|
out_path="debug_clusters.png"
|
|
):
|
|
img = cv2.imread(image_path)
|
|
if img is None:
|
|
print(f"❌ Cannot load image: {image_path}")
|
|
return
|
|
|
|
# Load bubbles.json
|
|
with open(bubbles_path, "r", encoding="utf-8") as f:
|
|
bubbles_data = json.load(f)
|
|
|
|
# Draw all quad polygons in white (erasing original text)
|
|
for bid_str, bubble_info in bubbles_data.items():
|
|
for quad in bubble_info.get("quads", []):
|
|
pts = np.array(quad, dtype=np.int32)
|
|
cv2.fillPoly(img, [pts], (255, 255, 255))
|
|
cv2.polylines(img, [pts], True, (180, 180, 180), 1)
|
|
|
|
# Draw bounding boxes with labels
|
|
for bid_str, bubble_info in bubbles_data.items():
|
|
bid = int(bid_str)
|
|
x = bubble_info["x"]
|
|
y = bubble_info["y"]
|
|
w = bubble_info["w"]
|
|
h = bubble_info["h"]
|
|
x2 = x + w
|
|
y2 = y + h
|
|
|
|
cv2.rectangle(img, (x, y), (x2, y2), (0, 220, 0), 2)
|
|
cv2.putText(img, f"BOX#{bid}", (x + 2, max(15, y + 16)),
|
|
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 220, 0), 2)
|
|
|
|
cv2.imwrite(out_path, img)
|
|
print(f"✅ Saved: {out_path}")
|
|
|
|
if __name__ == "__main__":
|
|
save_debug_clusters_from_json()
|