2

I'm trying to detect a face and then crop it to use it in a face recognition algorithm. Here is my code.

import numpy as np
import cv2
import Image

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('xD.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    print x
    print y
    print w
    print h
    img.crop((x,y,w,h))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

When I print (x,y,w,h), it gives precise coordinates, but when I crop it, it gives me this error.

img.crop((x,y,w,h))
AttributeError: 'numpy.ndarray' object has no attribute 'crop'

2
  • 1
    roi_color = img[y:y+h, x:x+w] is the cropped image already. Commented Feb 29, 2016 at 22:40
  • alright then how can I save it? Commented Feb 29, 2016 at 22:46

1 Answer 1

1
import numpy as np
import cv2
from PIL import Image

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('xD.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    cropped = img[y:y+h, x:x+w]
cv2.imwrite("thumbnail.png", cropped)
cv2.imshow("cropped", cropped)
cv2.waitKey(0)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.