Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
29 / 25 / 9
Регистрация: 26.05.2017
Сообщений: 261

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

16.08.2018, 17:16. Показов 9215. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru