summaryrefslogblamecommitdiff
path: root/units.py
blob: 6a656cca2c1450470c26d97aac329b48e239e707 (plain) (tree)







































































                                                                                                   























                                                                                                     







































                                                                                                                                              
#!/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)