#!/usr/bin/python3 import os, subprocess, cv2 # This is a much more complex script. BY ALL MEANS use base folder pwd = os.getcwd() f = open("ATTR.txt", "w") bf1=[] subprocess.call("cp ready-units/base/* ready-units/", shell=True) FILES = list(os.listdir(pwd + "/ready-units")) for it in FILES: if not it.endswith("png") and not it.endswith("jpg"): continue if it.startswith("sq_"): continue name = it.split(".")[0] path = pwd + "/ready-units/" sqne = "sq_%s" % it try: unitid = int(name) except: print("ERROR: %s is not parseable" % it) continue print("%s" % it) """ # Force to PNG if it.endswith("jpg"): # WARNING: DESTRUCTIVE subprocess.call("convert %s/%s %s/%s.png" % (path, it, path, it), shell=True) subprocess.call("rm %s/%s" % (path, it), shell=True) it = "%s.png" % it """ # Resizing img = cv2.imread(path+it) w, h = img.shape[:2] if h != 640 or w != 960: # Resize the image, relying entirely in ImageMagick # Preserving aspect ratio is turned OFF (Crop would be better) # WARNING: DESTRUCTIVE subprocess.call("convert %s/%s -resize 640x960\! %s/%s" % (path, it, path, it), shell=True) print("[OK] Image resized") # A square doesn't exists # Generate one with opencv if not sqne in FILES: cPath="lbpcascade_animeface.xml" iPath="ready-units/%s" % it cascade=cv2.CascadeClassifier(cPath) org_img=cv2.imread(iPath) img=cv2.cvtColor(org_img, cv2.COLOR_BGR2GRAY) maxi = 3.2 step = 0.1 curr = 1.0 faces = [] # Detect faces while len(faces) != 1: if curr == 1.0: faces = cascade.detectMultiScale(img, scaleFactor=1.01, minNeighbors=5) else: faces = cascade.detectMultiScale(img, scaleFactor=curr, minNeighbors=5) curr+=step if curr > maxi: break if len(faces) != 1: print("INFO: %s has %d anime faces, no square possible!" % (it, len(faces))) print("Retrying with human face...") cPath="lbpcascade_face.xml" iPath="ready-units/%s" % it cascade=cv2.CascadeClassifier(cPath) org_img=cv2.imread(iPath) img=cv2.cvtColor(org_img, cv2.COLOR_BGR2GRAY) maxi = 3.2 step = 0.1 curr = 1.0 faces = [] # Detect faces while len(faces) != 1: if curr == 1.0: faces = cascade.detectMultiScale(img, scaleFactor=1.01, minNeighbors=5) else: faces = cascade.detectMultiScale(img, scaleFactor=curr, minNeighbors=5) curr+=step if curr > maxi: break if len(faces) != 1: print("\033[1mERROR: %s has %d faces, no square possible!\033[0m" % (it, len(faces))) bf1.append("* ERROR: %s needs a square\n" % it) continue face=faces[0] # Calculate offset xoff=max(0, 340-face[2])/2 yoff=max(0, 340-face[3])/2 x=max(0, face[0]-xoff) y=max(0, face[1]-yoff) subprocess.call("convert %s -crop %dx%d+%d+%d %s/%s" % (iPath, 340, 340, x, y, path, sqne), shell=True) print("[OK] Success finding face at (%d,%d)" % (x, y)) # Resize the squared image (DESTRUCTIVE) # FIXME: Add alpha channel subprocess.call("convert %s/%s -resize 340x340\! -alpha on %s/%s.png" % (path, sqne, path, sqne), shell=True) # Format the squared image (DESTRUCTIVE) subprocess.call("convert %s/%s.png mask.png -alpha off -compose CopyOpacity -composite %s/%s.webp" % (path, sqne, path, sqne), shell=True) sqne+=".webp" # Make copies i=0 while i < 3: subprocess.call("convert %s/%s %s/unit/10%04d%02d.webp" % (path, it, path, unitid, i), shell=True) subprocess.call("convert %s/%s %s/square/10%04d%02d.webp" % (path, sqne, path, unitid, i), shell=True) i+=1 # Save to attribution bf1.append("\t10%04d NAME (AUTHOR)\t(CC BY SA)\t(SOURCE)\n" % (unitid)) # Save attribution file for it in sorted(bf1): f.write(it) f.close() # Remove the working files # IF YOU DID NOT USE BASE FOLDER, CONSIDER THE FILES FORSAKEN subprocess.call("rm ready-units/*.*", shell=True)