मैं फेस लोकेशन के आधार पर फसल कैसे काट सकता हूं?


13

मुझे एक घटना से 12,000 तस्वीरें मिली हैं, जहां प्रत्येक तस्वीर में केवल एक व्यक्ति है। मुझे इन तस्वीरों को तिहाई के नियम को लागू करने की आवश्यकता है। इन सभी को व्यक्तिगत रूप से करने का विचार कठिन है और मैं उन सभी के शीर्ष पर केवल 10% नहीं ले सकता क्योंकि हर तस्वीर थोड़ी अलग है।

क्या मेरे लिए व्यक्ति की स्थिति के आधार पर इन सभी तस्वीरों को स्वचालित रूप से क्रॉप करने का कोई तरीका है?


2
क्या यह फ़ोटोशॉप के साथ होना चाहिए? हो सकता है कि आप मैथेमेटिका के साथ तालमेल बिठाते हों या अजगर में कोई स्क्रिप्ट हो, अगर आप प्रोग्रामिंग के लिए पारंगत हैं। यदि संभव हो तो, समस्या / कंट्रास्ट / आदि को दर्शाने के लिए दो चित्र जोड़ें।
anderstood

यदि आप ImageMagick से परिचित हैं, तो आपको वही करना चाहिए जो आप देख रहे हैं। stackoverflow.com/questions/4813608/…
नेहल दत्तानी

मैंने OpenCV और अजगर का उपयोग करके कुछ इसी तरह की कोशिश की। यदि आप इस दिशा में ठीक हैं तो मैं अपनी स्क्रिप्ट को एक उत्तर में रख सकता हूं।
agtoever

यह फ़ोटोशॉप होना नहीं है, मैं इन समाधानों की कोशिश करूँगा!
नागरिक

जवाबों:


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स्थापित (बस opencvअपने प्लेटफ़ॉर्म के लिए कैसे स्थापित करें)।

फिर एक .pyफ़ाइल, "autocrop.py"या कुछ के रूप में उपरोक्त कोड को सहेजें , फिर इस फ़ाइल को डाउनलोड करें और सहेजें और इसे अपनी छवियों के समान निर्देशिका में डालें।

स्क्रिप्ट को .jpgफ़ोल्डर में सभी फाइलों को ढूंढना चाहिए और उन्हें अजगर कोड में निर्धारित पैडिंग सेटिंग्स के आधार पर क्रॉप करना चाहिए ।

उदाहरण:

नाटकीय होने के लिए उपरोक्त कोड 10 px पैडिंग के साथ, यहाँ स्रोत और परिणाम है:

यहाँ छवि विवरण दर्ज करें

परिणाम:

यहाँ छवि विवरण दर्ज करें

यहाँ ट्यूटोरियल मैं बेशर्मी से अनुकूलित है:

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

अस्वीकरण: Im इस उपकरण के डेवलपर।

आप बल्क में तस्वीरों से फेस और क्रॉप फेस का पता लगाने के लिए फेस क्रॉप जेट का उपयोग कर सकते हैं । किसी भी फॉर्मेट या साइज की तस्वीरों का समर्थन किया जाता है। जगह का पता लगाया जाएगा और स्वचालित रूप से क्रॉप किया जाएगा (न कि सिर्फ फेस, आईडी कार्ड के लिए एक प्रोफाइल पिक्चर)।

सॉफ्टवेयर को http://www.facecropjet.com से डाउनलोड किया जा सकता है

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.