File size: 2,829 Bytes
a54527e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import cv2
import numpy as np

# === Inputs ===
background = cv2.imread('assets/BACKGROUND.png')  # Background with circle
input_image = cv2.imread('frame_00_00_31_738.png')  # Full input image
bbox = (495, 595, 801, 820)  # Normalized (0–1000) format

# Get input image size
img_height, img_width = input_image.shape[:2]

# Convert normalized bbox to absolute pixel coordinates
y_min = int(bbox[0] / 1000.0 * img_height)
x_min = int(bbox[1] / 1000.0 * img_width)
y_max = int(bbox[2] / 1000.0 * img_height)
x_max = int(bbox[3] / 1000.0 * img_width)

# Bounding box size and center
bbox_w = x_max - x_min
bbox_h = y_max - y_min
bbox_center_x = x_min + bbox_w // 2
bbox_center_y = y_min + bbox_h // 2

# Target circle (on background)
circle_center = (296, 126)
circle_radius = 77
circle_diameter = 2 * circle_radius

# === 1. Compute scale so the bbox fits inside the circle ===
scale = min(circle_diameter / bbox_w, circle_diameter / bbox_h)

# === 2. Resize the entire input image ===
new_width = int(img_width * scale)
new_height = int(img_height * scale)
resized_image = cv2.resize(input_image, (new_width, new_height))

# === 3. Compute new center of the bbox after scaling ===
new_bbox_center_x = int(bbox_center_x * scale)
new_bbox_center_y = int(bbox_center_y * scale)

# === 4. Compute offset so that bbox center aligns with circle center ===
offset_x = circle_center[0] - new_bbox_center_x
offset_y = circle_center[1] - new_bbox_center_y

# === 5. Paste resized image onto background ===
# Create a blank canvas same size as background
canvas = np.zeros_like(background)

# Compute region where image will be placed
start_x = max(offset_x, 0)
start_y = max(offset_y, 0)

end_x = min(start_x + new_width, background.shape[1])
end_y = min(start_y + new_height, background.shape[0])

src_start_x = max(-offset_x, 0)
src_start_y = max(-offset_y, 0)

# Copy region from resized image to canvas
canvas[start_y:end_y, start_x:end_x] = resized_image[src_start_y:src_start_y + (end_y - start_y), src_start_x:src_start_x + (end_x - start_x)]

mask = cv2.imread('circle_mask.png', cv2.IMREAD_GRAYSCALE)
mask = cv2.resize(mask, (background.shape[1], background.shape[0]))  # Ensure same size

# Blend entire image (for use outside circle)
alpha = 0.3
beta = 1.0 - alpha
blended = cv2.addWeighted(canvas, alpha, background, beta, 0)

# Create 3-channel version of mask
mask_3c = cv2.merge([mask, mask, mask])

# Create inverse mask (inside circle)
inv_mask = cv2.bitwise_not(mask_3c)

# Apply blended background where mask is white (outside the circle)
outside = cv2.bitwise_and(blended, mask_3c)

# Apply original canvas (input image) where mask is black (inside the circle)
inside = cv2.bitwise_and(canvas, inv_mask)

# Combine both
combined = cv2.add(outside, inside)

# === 6. Save result ===
cv2.imwrite('output.png', combined)