ฉันจะแบทช์การครอบตัดตามตำแหน่งใบหน้าได้อย่างไร


13

ฉันมี 12,000 รูปจากเหตุการณ์ที่มีเพียงคนเดียวในแต่ละภาพ ฉันต้องการครอบตัดรูปภาพเหล่านี้เพื่อใช้กฎข้อที่สาม ความคิดในการทำสิ่งเหล่านี้ล้วนเป็นเรื่องที่น่ากลัวและฉันก็ไม่สามารถลดยอด 10% ไปได้เพราะทุกรูปมีความแตกต่างกันเล็กน้อย

มีวิธีให้ฉันครอบตัดรูปภาพเหล่านี้ทั้งหมดโดยอัตโนมัติตามตำแหน่งของบุคคลหรือไม่


2
ต้องอยู่กับ photoshop หรือไม่ บางทีคุณอาจจัดการกับ Mathematica หรือสคริปต์ในไพ ธ อนถ้าคุณคุ้นเคยกับการเขียนโปรแกรม ถ้าเป็นไปได้ให้เพิ่มรูปภาพสองรูปเพื่อแสดงปัญหา / ความคมชัด / ฯลฯ
anderstood

หากคุณคุ้นเคยกับ ImageMagick สิ่งนี้ควรทำในสิ่งที่คุณต้องการ stackoverflow.com/questions/4813608/…
Nehal Dattani

ฉันลองทำสิ่งที่คล้ายกันโดยใช้ OpenCV และ python ฉันสามารถใส่สคริปต์ของฉันในคำตอบถ้าคุณไม่เป็นไปตามทิศทางนี้
ทุกที่

ไม่จำเป็นต้องเป็น photoshop ฉันจะลองวิธีแก้ปัญหาเหล่านี้!
พลเมือง

คำตอบ:


15

นี่คือวิธีใช้pythonและopencv:

วิธีนี้จะครอบตัดใบหน้าทั้งหมดที่พบในรูปภาพ jpeg ในโฟลเดอร์ใด ๆ ก็ตามที่คุณเรียกใช้ด้วยการเติมเต็มที่ระบุโดยleft, right, top, bottomตัวแปร:

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)

ใช้

การใช้สคริปต์ข้างต้นที่คุณต้องการpythonและopencvติดตั้ง (เพียง google วิธีการติดตั้งopencvสำหรับแพลตฟอร์มของคุณ)

จากนั้นให้บันทึกรหัสข้างต้นเป็น.pyไฟล์"autocrop.py"หรือบางสิ่งจากนั้นดาวน์โหลดและบันทึกไฟล์นี้และวางไว้ในไดเรกทอรีเดียวกันกับภาพของคุณ

สคริปต์ควรค้นหา.jpgไฟล์ทั้งหมดในโฟลเดอร์และครอบตัดตามการตั้งค่าช่องว่างภายในที่ตั้งไว้ในรหัสไพ ธ อน

ตัวอย่าง:

ด้วยโค้ดด้านบนที่ตั้งไว้ที่ 10 px padding ให้น่าทึ่งนี่คือแหล่งที่มาและผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือการสอนที่ฉันปรับตัวไม่ลงรอยกัน:

https://realpython.com/blog/python/face-recognition-with-python/

การสอนนั้นดีกว่าการอธิบายทุกอย่างมากกว่าฉัน โดยทั่วไปฉันเพิ่งเอารหัสนั้นและเพิ่มในสิ่งเล็กน้อยเพื่อกระบวนการชุด (แทนการพิมพ์ชื่อไฟล์) แล้วบอกให้มันครอบตัดและบันทึกแทนการวาดรูปสี่เหลี่ยมผืนผ้าและแสดงภาพ


1
สำหรับ python3: 1. pip install opencv-python, 2. อัพเดตprintคำสั่งทั้งหมดเพื่อใช้วงเล็บ, 3. เปลี่ยนcv2.cv.CV_HAAR_SCALE_IMAGEเป็นcv2.CASCADE_SCALE_IMAGE(ที่มา: stackoverflow.com/a/36243142/2125392 )
CivFan

3

คำเตือน: ฉันเป็นผู้พัฒนาเครื่องมือนี้

คุณสามารถใช้Face Crop Jetในการตรวจจับและครอบตัดใบหน้าจากภาพถ่ายในกลุ่มภาพที่ได้รับการสนับสนุนในรูปแบบหรือขนาดใด ๆ ใบหน้าจะถูกตรวจจับและถูกครอบตัดโดยอัตโนมัติ (ไม่ใช่แค่ใบหน้าเท่านั้น

สามารถดาวน์โหลดซอฟต์แวร์ได้จาก http://www.facecropjet.com

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.