File size: 3,677 Bytes
7d835bb | 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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | """Generate synthetic example images for demo purposes."""
import os
import sys
import numpy as np
import cv2
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
def make_resistor_symbol(size: int = 60) -> np.ndarray:
"""Draw a simple resistor symbol (rectangle with leads)."""
img = np.full((size, size * 2), 255, dtype=np.uint8)
h, w = img.shape
cx, cy = w // 2, h // 2
# Body rectangle
cv2.rectangle(img, (cx - 20, cy - 8), (cx + 20, cy + 8), 0, 2)
# Left lead
cv2.line(img, (0, cy), (cx - 20, cy), 0, 2)
# Right lead
cv2.line(img, (cx + 20, cy), (w - 1, cy), 0, 2)
return img
def make_capacitor_symbol(size: int = 60) -> np.ndarray:
"""Draw a simple capacitor symbol (two parallel lines)."""
img = np.full((size, size * 2), 255, dtype=np.uint8)
h, w = img.shape
cx, cy = w // 2, h // 2
# Left plate
cv2.line(img, (cx - 4, cy - 20), (cx - 4, cy + 20), 0, 3)
# Right plate
cv2.line(img, (cx + 4, cy - 20), (cx + 4, cy + 20), 0, 3)
# Left lead
cv2.line(img, (0, cy), (cx - 4, cy), 0, 2)
# Right lead
cv2.line(img, (cx + 4, cy), (w - 1, cy), 0, 2)
return img
def place_symbol_on_drawing(
drawing: np.ndarray, symbol: np.ndarray, positions: list, angles: list = None
) -> np.ndarray:
"""Place symbol copies at specified positions."""
if angles is None:
angles = [0] * len(positions)
sh, sw = symbol.shape
for (px, py), angle in zip(positions, angles):
if angle != 0:
M = cv2.getRotationMatrix2D((sw / 2, sh / 2), angle, 1.0)
sym = cv2.warpAffine(symbol, M, (sw, sh), borderValue=255)
else:
sym = symbol
x1, y1 = px, py
x2, y2 = x1 + sw, y1 + sh
if x2 > drawing.shape[1] or y2 > drawing.shape[0]:
continue
roi = drawing[y1:y2, x1:x2]
mask = sym < 128
roi[mask] = sym[mask]
return drawing
def generate_examples(output_dir: str):
os.makedirs(output_dir, exist_ok=True)
# Example 1: Resistor pattern on circuit drawing
resistor = make_resistor_symbol(50)
drawing1 = np.full((600, 900), 255, dtype=np.uint8)
# Add a grid-like circuit background
for x in range(0, 900, 150):
cv2.line(drawing1, (x, 100), (x, 500), 200, 1)
for y in range(100, 600, 100):
cv2.line(drawing1, (50, y), (850, y), 200, 1)
positions1 = [(100, 250), (300, 150), (500, 350), (700, 200), (200, 420)]
drawing1 = place_symbol_on_drawing(drawing1, resistor, positions1, angles=[0, 2, -3, 1, 0])
cv2.imwrite(os.path.join(output_dir, "example1_pattern.png"), resistor)
cv2.imwrite(os.path.join(output_dir, "example1_drawing.png"), drawing1)
print(f"Generated example1: resistor × {len(positions1)}")
# Example 2: Capacitor pattern on PCB layout
capacitor = make_capacitor_symbol(50)
drawing2 = np.full((600, 900), 255, dtype=np.uint8)
# Add some PCB traces
for x in range(80, 820, 80):
cv2.line(drawing2, (x, 50), (x, 550), 220, 1)
cv2.rectangle(drawing2, (50, 50), (850, 550), 180, 2)
positions2 = [(120, 200), (320, 300), (520, 180), (720, 400)]
drawing2 = place_symbol_on_drawing(drawing2, capacitor, positions2, angles=[0, -2, 3, 0])
cv2.imwrite(os.path.join(output_dir, "example2_pattern.png"), capacitor)
cv2.imwrite(os.path.join(output_dir, "example2_drawing.png"), drawing2)
print(f"Generated example2: capacitor × {len(positions2)}")
print(f"\nExamples saved to: {output_dir}/")
if __name__ == "__main__":
out = os.path.join(os.path.dirname(__file__), "..", "examples")
generate_examples(out)
|