Đây là một giải pháp sử dụng python
và opencv
:
Thao tác này sẽ cắt tất cả các khuôn mặt mà nó tìm thấy trong ảnh jpeg trong bất kỳ thư mục nào bạn chạy nó, với phần đệm được chỉ định bởi các left, right, top, bottom
biến:
import cv2
import sys
import glob
cascPath = "haarcascade_frontalface_default.xml"
# Create the haar cascade
faceCascade = cv2.CascadeClassifier(cascPath)
files=glob.glob("*.jpg")
for file in files:
# Read the image
image = cv2.imread(file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Detect faces in the image
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)
print "Found {0} faces!".format(len(faces))
# Crop Padding
left = 10
right = 10
top = 10
bottom = 10
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
print x, y, w, h
# Dubugging boxes
# cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
image = image[y-top:y+h+bottom, x-left:x+w+right]
print "cropped_{1}{0}".format(str(file),str(x))
cv2.imwrite("cropped_{1}_{0}".format(str(file),str(x)), image)
Sử dụng
Để sử dụng tập lệnh trên bạn cần python
và opencv
cài đặt (chỉ cần google cách cài đặt opencv
cho nền tảng của bạn).
Sau đó lưu mã ở trên dưới dạng .py
tệp "autocrop.py"
hoặc một cái gì đó, sau đó tải xuống và lưu tệp này và đặt nó vào cùng thư mục với hình ảnh của bạn.
Tập lệnh sẽ tìm tất cả các .jpg
tệp trong thư mục và cắt chúng dựa trên các cài đặt phần đệm được đặt trong mã python.
Thí dụ:
Với đoạn mã trên được đặt thành 10 px padding thành kịch tính, đây là nguồn và kết quả:
Kết quả:
Đây là hướng dẫn tôi thích nghi một cách đáng xấu hổ:
https://realpython.com/blog/python/face-recognition-with-python/
Hướng dẫn đó tốt hơn nhiều trong việc giải thích mọi thứ so với tôi. Về cơ bản, tôi chỉ lấy mã đó và thêm vào một chút để xử lý hàng loạt (thay vì gõ tên tệp) và sau đó bảo nó cắt và lưu thay vì vẽ một hình chữ nhật và hiển thị hình ảnh.