поверните изображение на оси носа и глаз с помощью opencv - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть следующее изображение с глазами и точками шума.Парень на фотографии имеет минимальный наклон, и я хочу это нормализовать.У меня есть отметки с помощью dlib, и я могу рассчитать наклон.

Теперь, как я могу просто повернуть весь образ, что парень прямой?enter image description here

LEFT_EYE: [(274, 269), (286, 259), (302, 258), (317, 268), (302, 271), (286, 272)]
RIGHT_EYE : [(388, 264), (401, 254), (417, 252), (431, 261), (419, 265), (403, 265)]
NOSE: [(352, 257), (353, 278), (354, 297), (354, 319)]

Как идея, точки вершины на оси x - 352, 353, 354, 354. Теоретически, если я сделаю матричное преобразование, это изменит всех указывает на 352, шум будет прямым в линии.

Я думаю, что это можно сделать с помощью матричного преобразования, а точки шума или глаза - как векторного преобразования.Но мне нужен подход, как это можно решить.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Предполагая, что вы знаете градусы поворота (например, от 0 до 360 градусов).

Следующая функция выполняет только одно действие: поворачивает изображение, не пропуская ни одного пикселя исходного ввода.

enter image description here

Параметры: (1) исходное изображение;(2) степени вращения.Выводом должно быть повернутое изображение.

def rotate_bound(image, angle):
    # grab the dimensions of the image and then determine the
    # center
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)

    # grab the rotation matrix (applying the negative of the
    # angle to rotate clockwise), then grab the sine and cosine
    # (i.e., the rotation components of the matrix)
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # compute the new bounding dimensions of the image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY

    # perform the actual rotation and return the image
    return cv2.warpAffine(image, M, (nW, nH))

Реализация взята из отличного блога " Поворот изображения (правильно) с помощью OpenCV и Python ".Я верю, что вы можете найти больше деталей и полезного обучения там.

Веселитесь.

0 голосов
/ 28 ноября 2018

Сначала сделайте линейную подгонку к точкам носа и используйте наклон, чтобы найти угол.Чтобы сделать это, переключите значения x и y так, чтобы прямое направление вверх составляло угол 0 градусов (также, чтобы вы лучше подходили, когда нос почти прямо вверх, чтобы начать).

# Nose points
nose =  np.array([(352, 257), (353, 278), (354, 297), (354, 319)])

# Linear fit with x- and y-values switched
m,b = np.polyfit(nose[:,1], nose[:,0], 1)

# Angle in radians
angle = np.arctan(m)

Далее вы можете использовать opencv, чтобы получить матрицу вращения .Если центр вращения не имеет значения, вы можете просто вращаться вокруг центра изображения.Но ниже я поворачиваю его вокруг вершины носа, чтобы точки располагались вертикально вдоль линии x = 352, если вы этого хотите.Наконец, используйте матрицу вращения, чтобы повернуть изображение с cv2.warpAffine.

# Get rotation matrix
rot_mat = cv2.getRotationMatrix2D(tuple(nose[0]), -angle*180./np.pi, 1)

# Rotate image
dims = tuple(img.shape[:2][::-1])
rotated_image = cv2.warpAffine(img, rot_mat, dims)

Вот результирующее изображение:

enter image description here

...