Added face detection

pull/487/head
Karl Hobley 2014-07-17 16:09:10 +01:00
rodzic d539aaf128
commit 6f8b5faa06
3 zmienionych plików z 26212 dodań i 9 usunięć

Wyświetl plik

@ -58,9 +58,19 @@ class BaseImageBackend(object):
def smart_crop(self, image, size):
image_mode, image_data = self.image_data_as_rgb(image)
focal_points = feature_detection.detect_features(image.size, image_mode, image_data)
return self.crop_to_points(image, size, focal_points)
# Face detection
faces = feature_detection.detect_faces(image.size, image_mode, image_data)
if faces:
return self.crop_to_points(image, size, faces)
# Feature detection
features = feature_detection.detect_features(image.size, image_mode, image_data)
if features:
return self.crop_to_points(image, size, features)
# Fall back to crop to centre
return self.crop_to_centre(image, size)
def resize_to_max(self, image, size):
"""

Wyświetl plik

@ -1,3 +1,5 @@
import os
try:
import cv
@ -14,15 +16,20 @@ except ImportError:
from wagtail.wagtailimages.utils.focal_point import FocalPoint
def get_cv_gray_image(image_size, image_mode, image_data):
image = cv.CreateImageHeader(image_size, cv.IPL_DEPTH_8U, 3)
cv.SetData(image, image_data)
gray_image = cv.CreateImage(image_size, 8, 1)
convert_mode = getattr(cv, 'CV_%s2GRAY' % image_mode)
cv.CvtColor(image, gray_image, convert_mode)
return gray_image
def detect_features(image_size, image_mode, image_data):
if opencv_available:
image = cv.CreateImageHeader(image_size, cv.IPL_DEPTH_8U, 3)
cv.SetData(image, image_data)
gray_image = cv.CreateImage(image_size, 8, 1)
convert_mode = getattr(cv, 'CV_%s2GRAY' % image_mode)
cv.CvtColor(image, gray_image, convert_mode)
image = gray_image
image = get_cv_gray_image(image_size, image_mode, image_data)
rows = image_size[0]
cols = image_size[1]
@ -34,3 +41,27 @@ def detect_features(image_size, image_mode, image_data):
return [FocalPoint(x, y, 1) for x, y in points]
return []
def detect_faces(image_size, image_mode, image_data):
if opencv_available:
cascade_filename = os.path.join(os.path.dirname(__file__), 'face_detection', 'haarcascade_frontalface_alt.xml')
cascade = cv.Load(cascade_filename)
image = get_cv_gray_image(image_size, image_mode, image_data)
cv.EqualizeHist(image, image)
min_size = (40, 40)
haar_scale = 1.1
min_neighbors = 3
haar_flags = 0
faces = cv.HaarDetectObjects(
image, cascade, cv.CreateMemStorage(0),
haar_scale, min_neighbors, haar_flags, min_size
)
if faces:
return [FocalPoint.from_square(face[0][0], face[0][1], face[0][2], face[0][3]) for face in faces]
return []