canvasapp/graphics.py

207 lines
3.9 KiB
Python

import cv2, sys, glob, os
cascPath = "haarcascade_frontalface_default.xml"
# Create the haar cascade
#faceCascade = cv2.CascadeClassifier(cascPath)
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
folder = "cache/picsId/Pending/test/"
outfolder = "cache/picsId/Pending/test3/"
files=glob.glob(folder + "*.jpg")
i = 0
for file in files:
# Read the image
fn = file.split("/")[-1]
print(file)
print(fn)
image = cv2.imread(file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_size = image.shape
ww = img_size[0]
hh = img_size[1]
print("Image size: " + str(img_size))
# Detect faces in the image
faces = faceCascade.detectMultiScale(gray, minNeighbors=5, minSize=(70, 70))
"""
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.CASCADE_SCALE_IMAGE )
"""
print("Found %d faces!" % len(faces))
if len(faces)==0: exit()
# Crop Padding
left = 10
right = 10
top = 10
bottom = 10
# Draw a rectangle around the faces
j = 0
for (x, y, w, h) in faces:
k = j
if k == 0: k = ''
else: k = str(k) + '_'
# Dubugging boxes
# cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
new_x1 = x-left
new_y1 = y-top
new_x2 = x+w+right
new_y2 = y+h+bottom
x1 = max(new_x1, 0)
y1 = max(new_y1, 0)
x2 = min(new_x2, ww)
y2 = min(new_y2, hh)
xx1 = min(x1,x2)
xx2 = max(x1,x2)
yy1 = min(y1,y2)
yy2 = max(y1,y2)
print(x, y, w, h)
print(ww, hh)
print(xx1,xx2,yy1,yy2)
#image = image[y-top:y+h+bottom, x-left:x+w+right]
write_image = image[yy1:yy2, xx1:xx2]
print("Writing: " + outfolder + k + fn)
try:
cv2.imwrite(outfolder + k + fn, write_image)
except:
print(" (failed. was image too small?)")
j += 1
# print ("cropped_{1}{0}".format(str(file),str(x)))
# autocrop
#
"""
from PIL import Image
from autocrop import Cropper
cropper = Cropper()
# Get a Numpy array of the cropped image
cropped_array = cropper.crop('portrait.png')
# Save the cropped image with PIL
cropped_image = Image.fromarray(cropped_array)
cropped_image.save('cropped.png')
--------------
usage: [-h] [-o OUTPUT] [-i INPUT] [-w WIDTH] [-H HEIGHT] [-e EXTENSION] [-v]
Automatically crops faces from batches of pictures
optional arguments:
-h, --help
Show this help message and exit
-o, --output, -p, --path
Folder where cropped images will be placed.
Default: current working directory
-r, --reject
Folder where images without detected faces will be placed.
Default: same as output directory
-i, --input
Folder where images to crop are located.
Default: current working directory
-w, --width
Width of cropped files in px. Default=500
-H, --height
Height of cropped files in px. Default=500
--facePercent
Zoom factor. Percentage of face height to image height.
-e, --extension
Enter the image extension which to save at output.
Default: Your current image extension
-v, --version
Show program's version number and exit
autocrop -i . -o test4 -w 250 -H 333
"""
# smartcrop
#
#
# smartcrop -W 1140 -H 400 -i input.jpg -o output.jpg
#
#
# imagemagick jpeg compress
#
# convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.jpg
#
#
# convert image.jpg -define jpeg:extent=150kb result.jpg