Задать вопрос
@Vergil1718

Как настроить параметры определения лиц в OpenCV?

Возникла такая проблема, что для вебкамеры был написан скрипт по распознаванию лица, а для ip камеры тот же скрипт не работает (работает, но не определяет лица).
Первые шаги решения этой проблемы - поменять разрешение, тк на вебке было 640x480p, а на ip камере 1280x720p или fullHD.
разницы особо нету, все равно окошечко открывается в большом окне, что даже на монике не умещается.
почитал про faceCascade.detectMultiScale, и что есть несколько параметров такие как scaleFactor, minNeighbors, minSize. Из этого смог понять, что для каскада можно что-то увеличивать, можно настроить расстояние между соседними элементами, минимальное окошечко для распознавания лица.

Сам исходный код:
cam = cv2.VideoCapture("rtsp://имя юзера@ip.add.re.ss/mpeg4?username=имя юзера&password=пароль в MD5") #redacted

# cam.set(3, 640) # set video widht
# cam.set(4, 480) # set video height

cam.set(3, 1280) # set video widht
cam.set(4, 720) # set video height

state = True

is_start = open(projectpath+"/state.log")
state_for_start = is_start.readline()
if state_for_start == "0":
    state = True
    print("Запускаем скрипт")
else:
    state = False
    print("отредактируйте state.log")
is_start.close()

while state:

    is_start = open(projectpath+"/state.log")
    state_for_start = is_start.readline()
    if state_for_start == "0":
        state = True
#         print("Запускаем скрипт")
    else:
        state = False
        print("отредактируйте state.log")
    is_start.close()


    ret, img =cam.read()
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale( 
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5, # origin
        minSize = (100, 100) # not origin
       )

    for(x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
 
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))
            # ---> можно тыкнуть функцию сюда
        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)

#              Самообучение
# ------------------------------------------------------------------------------------------------
        if True:
            if id not in enterings:
                enterings.append(id)

            if id not in names:
                face_id=len(names)
                count += 1
                cv2.imwrite(path+"/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
                if count > count_of_shots:
                    restudying()
                    names.append("User."+str(face_id))
                    recognizer.read(projectpath+'/trainer/trainer.yml')
                    f = open(projectpath+"/enterings.log", "a")
                    count=0
                    f.write(str(face_id)+" User"+str(face_id)+"\n")                    
                    f.close

                    with open(projectpath+"/names.log", "w") as file:
                        for name in names:
                            file.write(name + '\n')

    cv2.imshow('camera',img) 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
cam.release()
cv2.destroyAllWindows()


Некоторые проблемы:
лица вообще не распознаются, даже если на изображении есть человек
camera-screenshot-24-09-2021.png
обнаруживается то что не должно обнаруживаться
camera-screenshot-24-09-2021.png
некоторые манипуляции minSize привели к тому что, объеты меньше 50х50 не распознаются как лицо

camera-screenshot-24-09-2021.png

Какие значения подбирать и на что это влияет?
  • Вопрос задан
  • 356 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Vergil1718 Автор вопроса
UPD: Понял, что можно менять scaleFactor и получать лучший результат, было бы отлично если кто-то дал подсказку в какую сторону гуглить чтобы поставить фоновый слой, и нейронка не пыталась бы части пейзажа выдать за лицо
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы