Files
momentry_core/scripts/crop_opencv_stamp.py
Warren 8f05a7c188 feat: update Python processors and add utility scripts
- Update ASR, face, OCR, pose processors
- Add release pre-flight check script
- Add synonym generation, chunk processing scripts
- Add face recognition, stamp search utilities
2026-04-30 15:07:49 +08:00

64 lines
2.3 KiB
Python

#!/opt/homebrew/bin/python3.11
"""
Crop the detected stamp from the OpenCV result.
"""
import cv2
import os
UUID = "384b0ff44aaaa1f1"
BASE_DIR = f"output/{UUID}/florence2_results"
IMG_NAME = "found_stamp_opencv.jpg"
IMG_PATH = os.path.join(BASE_DIR, IMG_NAME)
OUT_PATH = os.path.join(BASE_DIR, "stamp_crop_opencv.jpg")
# Coordinates from the OpenCV run: Area=30307.0, Box=(618,924)
# The box usually means x, y, w, h.
# We need to calculate w and h from area? No, findContours gives us points.
# Let's re-run the logic briefly to get exact coordinates or just crop roughly if we trust the box.
# Actually, the previous script printed Area=30307, Box=(618,924).
# BoundingRect returns (x, y, w, h).
# Let's assume it's roughly centered or just crop a region around x=618, y=924.
# Wait, area 30307 is large. 30307 = w * h.
# Maybe it's the woman's dress or a decoration?
# Let's crop the area around (618, 924) to see what it is.
# Let's guess it's roughly 150x200 or similar? sqrt(30307) approx 174.
# So x: 618-174/2 to 618+174/2 => 530 to 705?
# Let's just look at the full image result first, but I can't show images directly.
# I will crop a standard size region around the detected center.
import numpy as np
img = cv2.imread(IMG_PATH)
if img is None:
print("❌ Image not found.")
exit()
# Detected box x,y was 618,924. Let's assume this is the top-left or center.
# boundingRect returns x,y,w,h.
# Since I don't have w,h in the log, I will re-run detection quickly.
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red1 = np.array([0, 70, 50])
upper_red1 = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
lower_red2 = np.array([170, 70, 50])
upper_red2 = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 + mask2
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
if len(approx) == 3:
area = cv2.contourArea(approx)
if 200 < area < 50000:
x, y, w, h = cv2.boundingRect(approx)
print(f"✂️ Cropping at x={x}, y={y}, w={w}, h={h}, Area={area}")
# Crop
crop = img[y : y + h, x : x + w]
cv2.imwrite(OUT_PATH, crop)
print(f"✅ Saved crop to {OUT_PATH}")