Определение лица на изображении с помощью Python
Современные технологии компьютерного зрения и обработки изображений предоставляют возможность определения отдельных экземпляров конкретных классов, таких как лица, дома, машины, животные и так далее, на цифровых изображениях и видеороликах. В данной статье мы рассмотрим простой Python скрипт, определяющий лица людей на фото и выделяющий их отдельной рамкой. Скрипт реализован средствами библиотеки Opencv, и прежде всего набором данных из папки cv2, под названием haarcascade_fontalface_default.xml. Данный файл содержит в себе зашифрованные данные в виде функций на основе массива пикселей изображения, и использует метод называемый Каскадный классификатор на основе признаков Хаара. Вышеуказанный способ детектирования предпочтительнее для новичков. Также следует помнить что мы можем только найти и выделить то что нас интересует, но не классифицировать. Перейдем к коду:
# устанавливаем пакеты
pip3 install opencv-python numpy
import cv2
import numpy as np
# существенно здесь положение лица на фотографии, чем более фронтально оно расположено тем лучше распознование
# в некоторых случаях выходит ошибка в пути
image = cv2.imread("ууу/xxx/test.jpg")
# тогда используем второй метод
def cv_imread(file_path):
cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1) #
return cv_img
file_path = 'ууу/xxx/test.jpg'
# функция imread() загружает изображение из указанного файла и возвращает N-мерный массив
image = cv_imread(file_path)
# Функция детектор ожидает получить черно белое изображение, и поэтому отформатируем image
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# следующим этапом необходимо загрузить файл haarcascade_fontalface_default.xml либо если он установлен найти и прописать полный путь к нему или переместить в папку с нашим скриптом.
face_cascade = cv2.CascadeClassifier("полный_путь/haarcascade_fontalface_default.xml")
# функция detectMultiScale() принимает изображения, определяет искомые объекты и возвращает список прямоугольных областей
faces = face_cascad.detectMultiScale(image_gray)
print(str(len(faces)) + " faces detected in the image.")
# обведем каждое обнаруженное лицо синим прямоугольником
for x, y, width, height in faces:
cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
# сохраним полученное изображение
cv2.imwrite("detected.jpg", image)
# вывод на экран
cv2.imshow("detected.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Помимо лиц в .xml файл входящих в библиотеку Opencv, поддерживаются множество объектов, если же их недостаточно, можно создать собственный классификатор.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.