29 / 25 / 9
Регистрация: 26.05.2017
Сообщений: 261

Opencv - распознавание лиц

16.08.2018, 17:16. Показов 9587. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я взял код отсюда https://robotos.in/uroki/obnar... -na-python
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import cv2
import numpy as np
import os 
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
 
font = cv2.FONT_HERSHEY_SIMPLEX
 
#iniciate id counter
id = 0
 
# names related to ids: example ==> Marcelo: id=1,  etc
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W'] 
 
# Initialize and start realtime video capture
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
 
# Define min window size to be recognized as a face
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
 
while True:
    ret, img =cam.read()
    img = cv2.flip(img, -1) # Flip vertically
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    faces = faceCascade.detectMultiScale( 
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )
 
    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])
 
        # Check if confidence is less them 100 ==> "0" is perfect match 
        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)  
    
    cv2.imshow('camera',img) 
 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
 
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()
И изменил cam.set:
Python
1
2
cam.set(3, 160)
cam.set(4, 128)
Но теперь почти всегда лица, которые уже есть в базе распознаются как unkdown. Как так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2018, 17:16
Ответы с готовыми решениями:

OpenCV Распознавание черт лица
Привет, асы) Пишу программу, которая должна распознавать лица с картинки. Использую библиотеку компьютерного зрения OpenCV и язык...

OpenCV - распознавание фигур по контуру
Имеется два изображения на одном различные фигуры. разного цвета и размера. на другом фигура которую необходимо найти но она повернута и...

Распознавание прямоугольных обьектов с использованием opencv
Использую видеопоток в режиме реального времени с web-камеры с использованием cap = cv2.VideoCapture(0). В этом видеопотоке мне нужно в...

42
29 / 25 / 9
Регистрация: 26.05.2017
Сообщений: 261
30.08.2018, 14:20  [ТС]
Студворк — интернет-сервис помощи студентам
print(f.getvalue()) не выводит ничего или не успевает сработать до вылета скрипта.

Добавлено через 1 минуту
И, все таки, навряд ли второй скрипт отправил что-то корректное, если тоже завершился с ошибками.

Добавлено через 3 минуты
Интересно и то, что пока лица нет в кадре все работает нормально.

Добавлено через 3 минуты
Может дело в этом
Python
1
config.set("Quantity", "quantity", str(n+1))
Или можно перезадавать значения?(Эта строчка в цикле for faces, и может выполнятся несколько раз)
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
30.08.2018, 14:23
Надо проверять эти варианты

Добавлено через 29 секунд
Указана проблема в строке 77, проверьте переменную confidence
1
29 / 25 / 9
Регистрация: 26.05.2017
Сообщений: 261
30.08.2018, 17:02  [ТС]
Поставил print(str(confidence)) перед config.set("Quantity", "quantity", str(n+1)), он вывел -20%(Т.е. лицо не распознано)

Добавлено через 1 минуту
ValueError: invalid interpolation syntax in ' -20%' at position 5

Добавлено через 12 секунд
А Точно

Добавлено через 8 минут
Убрал %, теперь ошибок нет, но не выводиться cv2.imshow('img',img). Т.е.
Python
1
2
3
4
5
6
7
8
    while 1:
        try:
            tmp = conn.recv(1024)
        except BlockingIOError:
            continue
        if not tmp:
            break
        data += tmp
Работает вечно.

Добавлено через 8 минут
Суть в чем? tmp = conn.recv виснет, нока ждет данных, а не возвращает ничего в tmp, поэтому я поставил conn.setblocking(0), но в результате выводится ошибка(данные не могут быть получены мгновенно), так что я использовал try except, и это работало совсем недавно.

Добавлено через 27 минут
999.py отправляет все правильно... Ура!

Добавлено через 1 час 44 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import socket
import configparser
import io
import numpy as np
import cv2
 
sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()
conn.setblocking(0)
ncl = 0
 
print('connected:', addr)
 
while 1:
    data = b""
    Name = []
    Confidence = []
    x = []
    y = []
    w = []
    h = []
    img = np.zeros((160, 180, 3), np.uint8)
    #color = tuple(reversed(000000))#rgb_color черный
    img[:] = '000000'
    ncl += 1
 
    while 1:
        try:
            tmp = conn.recv(1024)
        except socket.error:
            break
        data += tmp     
        #f = io.StringIO(data.decode('utf-8'))###
        #print(f.getvalue())###
    
        if not data =='':
            f = io.StringIO(data.decode('utf-8'))
            config = configparser.RawConfigParser()
            try: config.readfp(f)
            except: continue
            ncl = 0
 
            quantity = config.get("Quantity", "quantity")
            for n in range(0, 1, int(quantity)):
                Name.append(config.get("Users", str(n)))
                Confidence.append(config.get("Confidence", str(n)))
                x.append(round(int((config.get("x", str(n))))/4))
                y.append(round(int((config.get("y", str(n))))/4))
                w.append(round(int((config.get("w", str(n))))/4))
                h.append(round(int((config.get("h", str(n))))/4))
 
            # x = [int(item) for item in x]
            # y = [int(item) for item in y]
            # w = [int(item) for item in w]
            # h = [int(item) for item in h]
 
            for n in range(0, 1, int(quantity)):
                print(Name,Confidence,x,y,w,h)
                cv2.rectangle(img, (x[n],y[n]), (x[n]+w[n],y[n]+h[n]), (0,255,0), 2)
                cv2.putText(img, str(Name[n]), (x[n]+5,y[n]-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2)
                cv2.putText(img, str(Confidence[n]), (x[n]+5,y[n]+h[n]-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,0), 1)  
 
            cv2.imshow('img',img)
    data = ""
    if ncl>10:
        cv2.imshow('img',img)
        ncl=0
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
 
 
conn.close()
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import cv2
import urllib.request
import numpy as np
import os 
import socket
import configparser
import io
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
 
font = cv2.FONT_HERSHEY_SIMPLEX
 
#iniciate id counter
id = 0
 
# names related to ids: example ==> Marcelo: id=1,  etc
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W'] 
 
minW = 0.1*480
minH = 0.1*480
 
sock = socket.socket()
sock.connect(('192.168.1.64', 9090))
stream = urllib.request.urlopen('http://192.168.1.64:8080/?action=stream')
bytes = bytes()
while True:
    bytes += stream.read(1024)
    a = bytes.find(b'\xff\xd8')
    b = bytes.find(b'\xff\xd9')
    if a != -1 and b != -1:
        jpg = bytes[a:b+2]
        bytes = bytes[b+2:]
        cam = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
        cv2.imshow('i', cam)
        if cv2.waitKey(1) == 27:
            exit(0)
        img =cam
        img = cv2.flip(img, -1) # Flip vertically
        
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        
        faces = faceCascade.detectMultiScale( 
            gray,
            scaleFactor = 1.2,
            minNeighbors = 5,
            minSize = (int(minW), int(minH)),
           )
        
        
        config = configparser.ConfigParser()
        config.add_section("Quantity")
        config.add_section("Users")
        config.add_section("Confidence")
        config.add_section("x")
        config.add_section("y")
        config.add_section("w")
        config.add_section("h")
        n = 0
        
        for(x,y,w,h) in faces:
            
            id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
        
            # Check if confidence is less them 100 ==> "0" is perfect match 
            if (confidence < 100):
                id = names[id]
                confidence = "  {0}".format(round(100 - confidence))
            else:
                id = "unknown"
                confidence = "  {0}".format(round(100 - confidence))
                
            config.set("Quantity", "quantity", str(n+1))
            config.set("Users", str(n), str(id))
            config.set("Confidence", str(n), str(confidence))
            config.set("x", str(n), str(x))
            config.set("y", str(n), str(y))
            config.set("w", str(n), str(w))
            config.set("h", str(n), str(h))
            n = n + 1
        
        f = io.StringIO()
        config.write(f)
        if not n==0:
            sock.sendall(f.getvalue().encode('utf-8'))
        
        cv2.imshow('camera',img) 
        
        k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
        if k == 27:
            break
Все работает как надо! Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.08.2018, 17:02

Распознавание лица на изображении (tkinter + OpenCV)
Всем доброго времени суток Делаю небольшой проект по распознаванию лица на изображении. Суть такова: 1) По нажатию на кнопку...

Opencv python распознавание показаний стрелочного прибора
Здравствуйте! Имеется код, который считывает показания вольтметра (приблизительно). Подскажите другую методику считывания, надежную. В...

Распознавание лиц с OpenCV
Уже видел тут подобную тему с кодом отсюда, только в ней человек находится на шагах выше. Я же пока что на 4 шаге. Код взял...

Распознавание лиц с OpenCv
Всем доброго времени суток. Помогите пожалуйста решить проблему поиска лица в видеопотоке. Теории начатался, знаю что нужно OpenCv и...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
43
Ответ Создать тему
Опции темы

Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru