Gesichtserkennung beim Drehen des Bildes Ich habe den besten Winkel nicht eingestellt Falls erforderlich, beziehen Sie sich auf Folgendes
Einfache Gesichtserkennungs-API mit Heroku + OpenCV
Face Detection using Haar Cascades
Ich möchte, dass Sie den Filter anstelle des Eingabebildes drehen und automatisch erkennen ...
Es mag für Leute, die an Bildverarbeitung gewöhnt sind, natürlich sein, aber da ich es kaum getan habe, bin ich ziemlich süchtig danach.
Die Reihenfolge kann beim Erfassen / Festlegen der Höhe und Breite des Bildes unterschiedlich sein.
--shape… Höhe (Zeilen), Breite (Spalten) --Slice nach Index ... [Untere Höhe (y): Obere Höhengrenze (y + h), Untere Breitengrenze (x): Obere Breitengrenze (x + w)] --OpenCV-Koordinatenspezifikation (Mittelpunkt usw.) ... (horizontal (x), vertikal (y))
Im Koordinatensystem der Anzeige ist die y-Achse nach unten gerichtet, der Winkel jedoch gegen den Uhrzeigersinn. Wenn also die normale y-Achse in das Koordinatensystem nach oben konvertiert wird, dreht sie sich im Uhrzeigersinn.
face_rotate_detect.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import cv2, os, sys, imghdr, shutil, math
import numpy as np
CWD = os.getcwd()
DIR_ORIGIN = CWD + '/images/'
DIR_DESTINATION = CWD + '/faces/'
classifier = cv2.CascadeClassifier('{python_dir}/{classifier_dir}/haarcascade_frontalface_alt2.xml'.format(
python_dir = os.path.split(sys.executable)[0],
classifier_dir = '../share/OpenCV/haarcascades',
))
def getFaces(path_full):
results = []
image = cv2.imread(path_full)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rows, cols, colors = image.shape
center = tuple(np.array([cols, rows]))
# get rotations
for angle in range(-90, 91, 5):
radian = np.deg2rad(angle)
output_height = int(np.absolute(cols * np.sin(radian)) + np.absolute(rows * np.cos(radian)))
output_width = int(np.absolute(cols * np.cos(radian)) + np.absolute(rows * np.sin(radian)))
output_size = tuple(np.array([output_width, output_height]))
# rotate
Matrix = cv2.getRotationMatrix2D(center, degree, 1.0)
# translate
Matrix[0, 2] += (output_width - width) * 0.5
Matrix[1, 2] += (output_height - height) * 0.5
# warp affine
rotated = cv2.warpAffine(gray, Matrix, output_size, flags = cv2.INTER_LINEAR)
# detect faces
faces = classifier.detectMultiScale(rotated)
if len(faces):
rotated_color = cv2.warpAffine(image, Matrix, output_size, flags = cv2.INTER_LINEAR)
for x, y, w, h in faces:
results.append(rotated_color[y : y + h, x : x + w])
return results
def saveFaces(faces):
global count
for face in faces:
cv2.imwrite(
'{dir_destination}{count}.jpg'.format(dir_destination = DIR_DESTINATION, count = count),
face,
[cv2.IMWRITE_JPEG_QUALITY, 100]
)
count += 1
count = 1
for path, subdirs, files in os.walk(DIR_ORIGIN):
for name in files:
path_full = os.path.join(path, name)
if imghdr.what(path_full) in ['jpeg']:
saveFaces(getFaces(path_full))
print(path_full)
Recommended Posts