Создайте текстовый файл с множеством массивов обнаружения лицевых маркеров.?

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

predictor_path = "C:\\Users\\G7K4\\Desktop\\FinalFaceSwap\\shape_predictor_68_face_landmarks.dat"
filepath1 =  "C:\\Users\\G7K4\\Desktop\\FinalFaceSwap\\Image\\nil.jpg"

image1 = cv2.imread(filepath1)


detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path) 
dets1 = detector(image1)

for k, d in enumerate(dets1):
shape = predictor(img1, d)
#Detect 68 facial landmark points
vec = np.empty([68, 2], dtype = int)
for b in range(68):
    vec[b][0] = shape.part(b).x
    vec[b][1] = shape.part(b).y

#write the detected file in text file
with open("Model1.txt","w") as file:
    for i in range(len(vec)):
        outer = ""
        outer += str(vec[i])
        file.write(outer)
        file.write("\n")

#read the text file and remove the brackets
with open("Model1.txt","r") as my_file:
    text=my_file.read()
    text= text.replace("[","")
    text= text.replace("]","")

#again write the file. 
with open("Model1.txt","w") as file:
    file.write(text)

#function for reading points from text file
def readPoints(path) :
    # Create an array of points.
    points = [];

    # Read points
    with open(path) as file :
        for line in file :
            x, y = line.split()
            points.append((int(x), int(y)))
    return points

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
806
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для работы с лицевым ориентиром dlib существует пакет imutils. Запустите pip install imutils, чтобы установить его. Вот краткий способ сделать это

from imutils import face_utils

shape = predictor(img1, d)
shape = face_utils.shape_to_np(shape)

# access the x-coordinate point 20 
x_20 = shape[20][0]

# access the y-coordinate point 54 
y_54 = shape[54][1]

Вам действительно нужно записать данные матрицы numpy в текстовом формате и удалить скобки позже. Вместо этого numpy уже предоставляет методы np.save() и np.load() для целей сериализации и десериализации.

Я предоставлю вам образец здесь. Также рекомендуется инкапсулировать ваши функции чтения и записи в отдельные методы, чтобы при изменении логики чтения / записи вам не нужно было сканировать весь код.

Создайте случайные точки черт лица:

facial_points = np.zeros((68, 2), dtype=np.uint8)

# Fill in some absurd values:
for i in xrange(68):
    facial_points[i] = np.asarray([i, i%10])

Служебные методы чтения и записи данных:

def serialize_feature_points(feature_points, file_path):
    np.save(file_path, feature_points)


def deserialize_feature_points(file_path):
    return np.load(file_path)

Время действовать:

serialize_feature_points(facial_points, "feature_points1.npy")
print deserialize_feature_points("feature_points1.npy")

[[ 0  0]
 [ 1  1]
 [ 2  2]
 .... 
 [65  5]
 [66  6]
 [67  7]]

Другие вопросы по теме