Как заставить программу обнаружать цвета не на всём изображении, а только внутри обводки лица?
Написал 2 нейронные сети с помощью openCV. Одна распознаёт лицо, вторая находит цвета на фото. Как можно их объединить так, чтобы сначала находилось лицо, обводилось и внутри этой обводки обнаруживались необходимые цвета?
Нейросеть по распознаванию лиц:
import cv2
import sys
imagePath = sys.argv[1]
cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE
)
print("Found {0} faces!".format(len(faces)))
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow("Faces found", image)
cv2.waitKey(0)
Команда запуска: python название.py название.png haarcascade_frontalface_default.xml
Нейросеть по поиску цвета:
import numpy as np
import argparse
import cv2
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help="path to the image")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
boundaries = [
([103, 86, 65], [255, 133, 128]),
([93, 89, 231], [140, 114, 255]),
]
for (lower, upper) in boundaries:
lower = np.array(lower, dtype="uint8")
upper = np.array(upper, dtype="uint8")
mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("images", np.hstack([image, output]))
cv2.waitKey(0)
Команда запуска: python название.py --image название.png