kopia lustrzana https://github.com/wagtail/wagtail
Added face detection
rodzic
d539aaf128
commit
6f8b5faa06
|
@ -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):
|
||||
"""
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -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 []
|
||||
|
|
Ładowanie…
Reference in New Issue