Archived
275 lines
7.2 KiB
Python
275 lines
7.2 KiB
Python
import cv2
|
|
import random
|
|
import numpy as np
|
|
|
|
IMGPATH = "blank_sheet.png"
|
|
|
|
cells = {
|
|
"all": [
|
|
"ACE",
|
|
"BODYBLOCK",
|
|
"Rawdog",
|
|
"Accidental teamkill",
|
|
"tirilnade",
|
|
"CS2 bug",
|
|
"\"DU HAR BOMBEN\"",
|
|
"A snake eating its own tail indicates that its excrement provides food for it",
|
|
"\"MORRAPULER\"",
|
|
"\"KLASKER\"",
|
|
"\"HÆ? Er jeg den eneste igjen?\"",
|
|
"Noen blir knifa",
|
|
"Noen blir zeusa",
|
|
"Noen caller cheats",
|
|
"Match win",
|
|
"Noen klager på luckshots",
|
|
"Noen caller hacks",
|
|
"Ace steal (noen tar siste kill)",
|
|
"comeback fra 6+ losses under mostanderen",
|
|
"\"Du så han\"",
|
|
"\"Du hørte han\"",
|
|
"Accidental teamflash",
|
|
"Noen suicider",
|
|
],
|
|
"parameterized": [
|
|
"{} acer",
|
|
"{} clutcher",
|
|
"{} blir knifa",
|
|
"{} knifer noen",
|
|
"{} zeuser noen",
|
|
"{} topfragger",
|
|
"{} bottomfragger",
|
|
"{} 1deager",
|
|
],
|
|
"markus": [
|
|
"Markus bommer lineup",
|
|
"Markus finner på excuse for at han suger",
|
|
"Markus prater om spray transfers",
|
|
],
|
|
"helen": [
|
|
"Lille skløtte",
|
|
"Henrik tar over",
|
|
"Helen deafener seg selv",
|
|
],
|
|
"hanna": [
|
|
"Hanna tror hun spiller valo",
|
|
],
|
|
"leander": [
|
|
"Leander bommer et lett awp shot",
|
|
"Leander er for redd for å bli hørt av fienden",
|
|
"Leander accidentally hopper når han skyter noen",
|
|
],
|
|
"petter": [
|
|
"Petter roper NÆÆÆÆÆÆÆIIIII",
|
|
"Petter topfragger",
|
|
],
|
|
"tita": [
|
|
"Tita får >2 kills i en runde",
|
|
"Tita snur ryggen til en fiende",
|
|
],
|
|
"thea": [
|
|
"Thea får run n gun headshots med m4a1s",
|
|
"Thea prøver å banne overpass",
|
|
],
|
|
"stash": [
|
|
"Stash thrower clutchen",
|
|
],
|
|
"mathias": [
|
|
"Mathias får mer enn 2 kills med xm",
|
|
"Mathias spiller cs2",
|
|
],
|
|
"seb": [
|
|
"Seb kjøper shotgun",
|
|
"Seb ignorerer strat og løper alene inn på en site",
|
|
],
|
|
"kristoffer": [
|
|
"Kristoffer baiter oss bare for å ninja defuse",
|
|
"Kristoffer ninja defuser",
|
|
"Kristoffer caller strat",
|
|
],
|
|
"sven": [
|
|
"Sven spiller CS2",
|
|
],
|
|
"randoms": [
|
|
"Vi får en russer på laget",
|
|
]
|
|
|
|
}
|
|
|
|
import cv2
|
|
|
|
import cv2
|
|
|
|
import cv2
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
import numpy as np
|
|
|
|
def put_text_in_box(image, text, top_left, bottom_right, font_path, font_size=20, color=(0, 0, 0)):
|
|
"""
|
|
Puts text inside a bounding box on the cv2 image with automatic text wrapping, using PIL for text rendering.
|
|
|
|
:param image: Source cv2 image (numpy array).
|
|
:param text: Text string to be put.
|
|
:param top_left: Tuple (x, y) defining the top-left corner of the bounding box.
|
|
:param bottom_right: Tuple (x, y) defining the bottom-right corner of the bounding box.
|
|
:param font_path: Path to a .ttf font file.
|
|
:param font_size: Initial font size.
|
|
:param color: Text color in RGB.
|
|
:return: Image with text (numpy array).
|
|
"""
|
|
|
|
# Convert the cv2 image to a PIL image
|
|
image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
|
|
draw = ImageDraw.Draw(image_pil)
|
|
font = ImageFont.truetype(font_path, font_size)
|
|
|
|
# Calculate text size and wrapping
|
|
x1, y1 = top_left
|
|
x2, y2 = bottom_right
|
|
w, h = x2 - x1, y2 - y1
|
|
lines = []
|
|
line = []
|
|
|
|
for word in text.split():
|
|
# Check if adding the word to the line would exceed the width
|
|
line_width, _ = draw.textsize(' '.join(line + [word]), font=font)
|
|
if line_width <= w:
|
|
line.append(word)
|
|
else:
|
|
lines.append(' '.join(line))
|
|
line = [word]
|
|
|
|
# Add the last line
|
|
lines.append(' '.join(line))
|
|
|
|
# Draw text
|
|
y = y1
|
|
for line in lines:
|
|
draw.text((x1, y), line, fill=color, font=font)
|
|
y += font.getsize(line)[1]
|
|
|
|
# Convert back to cv2 image format and update the original image
|
|
cv2_image = cv2.cvtColor(np.array(image_pil), cv2.COLOR_RGB2BGR)
|
|
np.copyto(image, cv2_image)
|
|
|
|
|
|
def sample_cells(players: list[str]) -> dict[str, list[str]]:
|
|
assert 0 < len(players) <= 6
|
|
|
|
default_space = cells["all"]
|
|
|
|
if len(players) < 5:
|
|
default_space += cells["randoms"]
|
|
|
|
player_cells = {
|
|
|
|
}
|
|
|
|
for player in players:
|
|
other_players = players.copy()
|
|
other_players.remove(player)
|
|
player_space = default_space + [i for player in players for i in cells[player] if player in cells]
|
|
other_players.append("du")
|
|
player_space += [s.format(random.choice(other_players)) for s in cells["parameterized"]]
|
|
|
|
sampled_cells = np.random.choice(player_space, replace=False, size=25)
|
|
player_cells[player] = list(sampled_cells)
|
|
|
|
print(player_cells)
|
|
return player_cells
|
|
|
|
|
|
def generate_sheets(players):
|
|
sample_space = sample_cells(players)
|
|
assert len(sample_space) == len(players)
|
|
image = cv2.imread(IMGPATH)
|
|
|
|
player_sheets = {
|
|
|
|
}
|
|
|
|
for player in players:
|
|
player_sheets[player] = generate_sheet(sample_space[player], image)
|
|
|
|
for p, sheet in player_sheets.items():
|
|
cv2.imwrite(p + ".png", sheet)
|
|
|
|
|
|
def generate_sheet(sample_space: list, image: np.ndarray):
|
|
image = image.copy()
|
|
|
|
start = 8, 294
|
|
end = 625, 910
|
|
|
|
sliced = image[295:910, 10:625]
|
|
patches = []
|
|
|
|
for i in range(0, 5):
|
|
for j in range(0, 5):
|
|
print(sample_space)
|
|
|
|
width = 123
|
|
put_text_in_box(
|
|
sliced, sample_space.pop(), (i*width+1, j*width+1), ((i+1)*width, (j+1)*width), font_path="/mnt/c/Windows/Fonts/comic.ttf"
|
|
)
|
|
# tile = sliced[i*width:(i+1)*width, j*width: (j+1)*width]
|
|
# for i in range(0, 5):
|
|
# for j in range(0, 5):
|
|
# width = 123
|
|
# index = random.randint(0, len(patches)-1)
|
|
# tile = patches.pop(index)
|
|
# sliced[i*width:(i+1)*width, j*width: (j+1)*width] = tile
|
|
|
|
return image
|
|
|
|
def clear_sheet(path):
|
|
image = cv2.imread(path)
|
|
|
|
start = 8, 294
|
|
end = 625, 910
|
|
|
|
sliced = image[295:910, 10:625]
|
|
patches = []
|
|
|
|
# for i in range(0, 5):
|
|
# for j in range(0, 5):
|
|
# width = 123
|
|
# tile = sliced[i*width:(i+1)*width, j*width: (j+1)*width].copy()
|
|
# patches.append(tile)
|
|
|
|
for i in range(0, 5):
|
|
for j in range(0, 5):
|
|
width = 123
|
|
sliced[i*width+i:(i+1)*width, j*width+j: (j+1)*width] = 255
|
|
|
|
cv2.imwrite(f"CLEARED_{path}", image)
|
|
|
|
|
|
|
|
# def generate_sheet(path):
|
|
# image = cv2.imread(path)
|
|
|
|
# start = 8, 294
|
|
# end = 625, 910
|
|
|
|
# sliced = image[295:910, 10:625]
|
|
# patches = []
|
|
|
|
# for i in range(0, 5):
|
|
# for j in range(0, 5):
|
|
# width = 123
|
|
# tile = sliced[i*width:(i+1)*width, j*width: (j+1)*width].copy()
|
|
# patches.append(tile)
|
|
|
|
# for i in range(0, 5):
|
|
# for j in range(0, 5):
|
|
# width = 123
|
|
# index = random.randint(0, len(patches)-1)
|
|
# tile = patches.pop(index)
|
|
# sliced[i*width:(i+1)*width, j*width: (j+1)*width] = tile
|
|
|
|
# return image
|
|
|
|
|
|
generate_sheets(
|
|
["markus", "sven"]
|
|
) |