Возникла такая проблема, что для вебкамеры был написан скрипт по распознаванию лица, а для 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()
Некоторые проблемы:
лица вообще не распознаются, даже если на изображении есть человек
обнаруживается то что не должно обнаруживаться
некоторые манипуляции minSize привели к тому что, объеты меньше 50х50 не распознаются как лицо
Какие значения подбирать и на что это влияет?