Làm thế nào tôi có thể cắt hàng loạt dựa trên vị trí khuôn mặt?


13

Tôi đã có 12.000 bức ảnh từ một sự kiện chỉ có một người trong mỗi bức ảnh. Tôi cần cắt những bức ảnh này để áp dụng quy tắc một phần ba. Ý tưởng thực hiện tất cả những điều này là rất khó khăn và tôi không thể lấy 10% ra khỏi đầu tất cả vì mỗi bức ảnh có một chút khác biệt.

Có cách nào để tôi tự động cắt tất cả những bức ảnh này dựa trên vị trí của người đó không?


2
Có phải là với photoshop? Có thể bạn kết hợp quản lý với Mathicala hoặc một tập lệnh trong python, nếu bạn thành thạo lập trình. Nếu có thể, hãy thêm hai hình ảnh để minh họa vấn đề / độ tương phản / v.v.
hiểu

Nếu bạn đã quen thuộc với ImageMagick, điều này sẽ làm những gì bạn đang tìm kiếm. stackoverflow.com/questions/4813608/
Mạnh

Tôi đã thử một cái gì đó tương tự bằng cách sử dụng OpenCV và python. Tôi có thể đặt kịch bản của mình vào câu trả lời nếu bạn ổn với hướng này.
bất cứ lúc nào 23/2/2015

Không nhất thiết phải là photoshop, tôi sẽ thử những giải pháp này!
Công dân

Câu trả lời:


15

Đây là một giải pháp sử dụng pythonopencv:

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, bottombiế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 pythonopencvcài đặt (chỉ cần google cách cài đặt opencvcho nền tảng của bạn).

Sau đó lưu mã ở trên dưới dạng .pytệ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 .jpgtệ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ả:

nhập mô tả hình ảnh ở đây

Kết quả:

nhập mô tả hình ảnh ở đây

Đâ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.


1
Đối với python3: 1. pip install opencv-python, 2. Cập nhật tất cả các printcâu lệnh để sử dụng dấu ngoặc đơn, 3. Thay đổi cv2.cv.CV_HAAR_SCALE_IMAGEthành cv2.CASCADE_SCALE_IMAGE(nguồn: stackoverflow.com/a/36243142/2125392 )
CivilFan

3

Disclaimer: Tôi là nhà phát triển của công cụ này.

Bạn có thể sử dụng Face Crop Jet để phát hiện và cắt khuôn mặt từ ảnh trong Hàng loạt. Hình ảnh của bất kỳ Định dạng hoặc Kích thước nào đều được hỗ trợ. Các giao diện sẽ được tự động phát hiện và cắt (không chỉ khuôn mặt, ảnh hồ sơ cho thẻ id).

Phần mềm có thể được tải xuống từ http://www.facecropjet.com

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.