делаем из двух лиц одно на фото

нужна программа которая на фото находит область лица
а потом из двух лиц делает новое среднее на основе морфинга точек глаз носа и губ

Создание программы, которая находит области лиц на фотографиях и выполняет морфинг между двумя лицами, требует использования библиотек для обработки изображений и машинного обучения. Вот примерный план, как это можно реализовать с помощью Python и библиотек OpenCV и dlib для обнаружения лиц, а также NumPy и Matplotlib для работы с изображениями.

Шаг 1: Установка необходимых библиотек
Убедитесь, что у вас установлены необходимые библиотеки. Вы можете установить их с помощью pip:

pip install opencv-python dlib numpy matplotlib
Шаг 2: Обнаружение лиц
Используйте dlib для обнаружения лиц и ключевых точек (глаза, нос, губы).

import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt

# Загрузка детектора лиц и предсказателя ключевых точек
detector = dlib.get_frontal_face_detector()
predictor =
def get_face_landmarks(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    landmarks = []
    for face in faces:
        shape = predictor(gray, face)
        landmarks.append([(p.x, p.y) for p in shape.parts()])
    return landmarks

# Пример использования
image1 = cv2.imread('face1.jpg')
image2 = cv2.imread('face2.jpg')

landmarks1 = get_face_landmarks(image1)
landmarks2 = get_face_landmarks(image2)
Найти еще
Шаг 3: Морфинг лиц
Теперь, когда у нас есть ключевые точки, мы можем создать функцию для морфинга.

def morph_faces(landmarks1, landmarks2, alpha):
    morphed_landmarks = []
    for (x1, y1), (x2, y2) in zip(landmarks1[0], landmarks2[0]):
        morphed_landmarks.append((int(x1 * (1 - alpha) + x2 * alpha), int(y1 * (1 - alpha) + y2 * alpha)))
    return morphed_landmarks

# Пример морфинга
alpha = 0.5  # 0.0 -> только лицо 1, 1.0 -> только лицо 2
morphed_landmarks = morph_faces(landmarks1, landmarks2, alpha)
Шаг 4: Рендеринг нового лица
Теперь вам нужно создать изображение на основе морфированных ключевых точек. Это можно сделать с использованием триангуляции и интерполяции.

def render_morphed_face(image1, image2, landmarks1, landmarks2, morphed_landmarks):
    # Здесь вы можете использовать триангуляцию для создания нового изображения
    # Это требует более сложной обработки, например, с использованием OpenCV или других библиотек
    # Для простоты, здесь представлен только общий подход
    pass  # Реализация рендеринга

# Вызываем функцию рендеринга
# render_morphed_face(image1, image2, landmarks1, landmarks2, morphed_landmarks)
Заключение
Этот код является базовым примером и требует доработки, особенно в части рендеринга нового лица с использованием триангуляции и интерполяции. Вам потребуется использовать функции OpenCV для создания треугольников и интерполяции пикселей между изображениями.

Не забудьте загрузить файл shape_predictor_68_face_landmarks.dat, который можно найти в репозитории dlib или в интернете.

а нельзя сделать проще создать два слоя и наложить их вместе
по размеру картинки -
так чтобы расстояния локаций точек между глаз и губ совпали

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

Шаг 1: Установка необходимых библиотек
Если вы еще не установили необходимые библиотеки, выполните:

pip install opencv-python dlib numpy matplotlib
Шаг 2: Обнаружение лиц и ключевых точек
Используйте dlib для обнаружения лиц и ключевых точек:

import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt

# Загрузка детектора лиц и предсказателя ключевых точек
detector = dlib.get_frontal_face_detector()
predictor =
def get_face_landmarks(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    landmarks = []
    for face in faces:
        shape = predictor(gray, face)
        landmarks.append([(p.x, p.y) for p in shape.parts()])
    return landmarks

# Пример использования
image1 = cv2.imread('face1.jpg')
image2 = cv2.imread('face2.jpg')

landmarks1 = get_face_landmarks(image1)
landmarks2 = get_face_landmarks(image2)
Найти еще
Шаг 3: Наложение изображений
Теперь можно создать функцию, которая будет накладывать два изображения, выравнивая ключевые точки.

def overlay_faces(image1, image2, landmarks1, landmarks2, alpha):
    # Приведение изображений к одинаковому размеру
    image1 = cv2.resize(image1, (500, 500))
    image2 = cv2.resize(image2, (500, 500))
   
    # Создание маски для наложения
    mask = np.zeros_like(image1)

    # Вычисление морфированных ключевых точек
    morphed_landmarks = [(int(x1 * (1 - alpha) + x2 * alpha), int(y1 * (1 - alpha) + y2 * alpha))
                for (x1, y1), (x2, y2) in zip(landmarks1[0], landmarks2[0])]

    # Создание маски на основе морфированных ключевых точек
    for (x, y) in morphed_landmarks:
        cv2.circle(mask, (x, y), 3, (255, 255, 255), -1)

    # Наложение изображений
    blended = cv2.addWeighted(image1, alpha, image2, 1 - alpha, 0)
   
    # Наложение маски на смешанное изображение
    blended = cv2.bitwise_and(blended, blended, mask=mask[:, :, 0])

    return blended

# Пример наложения
alpha = 0.5  # 0.0 -> только лицо 1, 1.0 -> только лицо 2
result = overlay_faces(image1, image2, landmarks1, landmarks2, alpha)

# Отображение результата
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()



Этот код создает наложение двух лиц с учетом ключевых точек. Вы можете изменять значение alpha, чтобы управлять соотношением между двумя изображениями. Этот метод проще, но также может быть менее точным, чем более сложные методы, основанные на триангуляции и интерполяции. Однако он может дать неплохие результаты в зависимости от качества исходных изображений и расположения лиц.

напиши один код этой программы и там же находятся два фото jpg в этой же папке с программой

Конечно! Вот полный код программы, который включает в себя обнаружение лиц, наложение изображений и использование двух фотографий в формате JPG, которые должны находиться в одной папке с программой. Убедитесь, что у вас есть файл shape_predictor_68_face_landmarks.dat в той же папке.


Полный код программы

import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt

# Загрузка детектора лиц и предсказателя ключевых точек
detector = dlib.get_frontal_face_detector()
predictor =
def get_face_landmarks(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    landmarks = []
    for face in faces:
        shape = predictor(gray, face)
        landmarks.append([(p.x, p.y) for p in shape.parts()])
    return landmarks

def overlay_faces(image1, image2, landmarks1, landmarks2, alpha):
    # Приведение изображений к одинаковому размеру
    image1 = cv2.resize(image1, (500, 500))
    image2 = cv2.resize(image2, (500, 500))
   
    # Создание маски для наложения
    mask = np.zeros_like(image1)

    # Вычисление морфированных ключевых точек
    morphed_landmarks = [(int(x1 * (1 - alpha) + x2 * alpha), int(y1 * (1 - alpha) + y2 * alpha))
                for (x1, y1), (x2, y2) in zip(landmarks1[0], landmarks2[0])]

    # Создание маски на основе морфированных ключевых точек
    for (x, y) in morphed_landmarks:
        cv2.circle(mask, (x, y), 3, (255, 255, 255), -1)

    # Наложение изображений
    blended = cv2.addWeighted(image1, alpha, image2, 1 - alpha, 0)
   
    # Наложение маски на смешанное изображение
    blended = cv2.bitwise_and(blended, blended, mask=mask[:, :, 0])

    return blended

# Загрузка изображений
image1 = cv2.imread('face1.jpg')  # Убедитесь, что файл face1.jpg в той же папке
image2 = cv2.imread('face2.jpg')  # Убедитесь, что файл face2.jpg в той же папке

# Получение ключевых точек
landmarks1 = get_face_landmarks(image1)
landmarks2 = get_face_landmarks(image2)

# Проверка, найдены ли лица
if not landmarks1 or not landmarks2:
    print("Не удалось обнаружить лица на одном или обоих изображениях.")
else:
    # Пример наложения
    alpha = 0.5  # 0.0 -> только лицо 1, 1.0 -> только лицо 2
    result = overlay_faces(image1, image2, landmarks1, landmarks2, alpha)

    # Отображение результата
    plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
    plt.axis('off')
    plt.show()



Инструкции по запуску программы
Убедитесь, что у вас установлены необходимые библиотеки: opencv-python, dlib, numpy, matplotlib.
Поместите фотографии face1.jpg и face2.jpg в ту же папку, где находится этот скрипт.
Скачайте файл shape_predictor_68_face_landmarks.dat и поместите его в ту же папку.
Запустите скрипт.
Программа обнаружит лица на изображениях и создаст наложение, отображая результат.
Если лица не удастся обнаружить, программа выведет соответствующее сообщение.


Рецензии