1. Что такое OpenCV?

OpenCV (Библиотека компьютерного зрения с открытым исходным кодом) — это библиотека программного обеспечения для компьютерного зрения и машинного обучения с открытым исходным кодом. OpenCV был создан, чтобы обеспечить общую инфраструктуру для приложений компьютерного зрения и ускорить использование машинного восприятия в коммерческих продуктах. В библиотеке более 2500 оптимизированных алгоритмов. Эти алгоритмы можно использовать для обнаружения и распознавания лиц, идентификации объектов, классификации действий человека в видео, отслеживания движений камеры, отслеживания движущихся объектов, объединения изображений для получения изображения всей сцены с высоким разрешением, поиска похожих изображений из базы данных изображений, удалить эффект красных глаз на изображениях, снятых со вспышкой, следить за движением глаз и т. д.

2. Хааркаскад:

Haar Cascade — это алгоритм обнаружения объектов машинного обучения, используемый для идентификации объектов на изображении или видео. Haarcascade обычно используется для определения определенных черт лица, таких как глаза, улыбка, лицо. Это будет чрезвычайно полезно в нашем проекте, так как нам нужно определить определенные черты лица, прежде чем накладывать на них нужные фильтры.

3. Этапы создания фильтров:

I. Обнаружение определенной черты лица с помощью haarcascade и openCV.

II. Получите координаты обнаруженного объекта в кадре.

III. Замените часть кадра, обозначенную координатами, на нужное изображение фильтра.

I. Импортируйте файлы opencv и соответствующие xml-файлы haarcascade.

import cv2
face1 = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0) #Use the system camera for capturing video
repl1 = cv2.imread('mask4.png')  #Load the filter image

II.

while True: 
    ret,frame = cap.read()  #Saving the captured video frames
# The frames captured are by default mirrored so they need to be flipped before using further
    frame = cv2.flip(frame,1) 
# Converting the image to grayscale makes it easier for processing 
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

После преобразования изображения в оттенки серого мы можем начать наложение фильтров.

f = face1.detectMultiScale(gray,scaleFactor = 1.1,minNeighbors = 7)
#This will capture the features in the given image and save them.

Обратитесь к изображению выше для следующего наложения:

for x,y,w,h in f:
        #frame = cv2.rectangle(frame,(x,y),(x+h,y+w),(0,255,0),2) (Optional : Rectangle can be displayed for reference)
frame[y:y+w,x:x+h] = repl1 
        cv2.imshow('Face Recognized',frame)
# Frame will be closed by pressing 'q' key:
if cv2.waitKey(1) == ord('q'): 
        break

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

repl1 = cv2.resize(repl1,(w,h))
#This needs to be added before the replacement of overlay in the frame.

Динамическое изменение размера резко изменит разрешение изображения, но решит указанную выше проблему.

Наконец, нам нужно закрыть системную камеру после того, как ее функции будут выполнены.

cap.release()          
cv2.destroyAllWindows()

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

Демонстрационное изображение фильтра: