Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208

Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow

03.02.2020, 21:34. Показов 4453. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый вечер, форумчане! Я пытаюсь сделать программу для обнаружения лиц по инструкциям на этом сайте
https://robotos.in/uroki/obnar... -na-python
но на этапе тренировки возникли проблемы. Все папки созданы, xml-образы лежат на своих местах и библиотека pillow уже стоит, но почему-то PyCharm ругается на отсутствие атрибута face в библиотеке cv2. Сможете показать, где и что нужно исправить, нужна ли точка с запятой после создания объекта CascadeClassifier и как правильно ставить pillow на анаконду? Использую Anaconda 2019 Prompt, PyCharm Community, OpenCV 4.1.2 и Python 3.7.

Исходный код:
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
import cv2
import numpy as np
from PIL import Image
import os
 
# Path for face image database
path = 'dataset'
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
 
# function to get the images and label data
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    faceSamples=[]
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L')
        # convert it to grayscale
        img_numpy = np.array(PIL_img, 'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faces = detector.detectMultiScale(img_numpy)
        for (x, y, w, h) in faces:
            faceSamples.append(img_numpy[y:y+h, x:x+w])
            ids.append(id)
    return faceSamples, ids
 
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces, ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
 
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml')
# recognizer.save() worked on Mac, but not on Pi
 
# Print the numer of faces trained and end program
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))
Ошибки:
XML
1
2
3
4
5
6
7
D:\Python\python.exe C:/demo4/opencv_demo4.py
Traceback (most recent call last):
  File "C:/demo4/opencv_demo4.py", line 9, in <module>
    recognizer = cv2.LBPHFaceRecognizer_create()
AttributeError: module 'cv2' has no attribute 'LBPHFaceRecognizer_create'
 
Process finished with exit code 1
Миниатюры
Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow   Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow   Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow  

Изображения
  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2020, 21:34
Ответы с готовыми решениями:

Обработка растровых изображений с применением библиотеки OpenCV: проблемы с апроксимацией и нахождением вершин фигуры
Добрый день! Я - новичок в Python и начал изучать OpenCV по примерам на этом сайте: ...

Обработка растровых изображений и анимация в C++
Требуется создать под Win32 эффект анимации на загруженном в окно изображении .bmp Анимация должна быть в виде волны, проходящей по...

Обработка растровых изображений и анимация в C++
Добрый день, уважаемые программисты! Требуется создать под Win32 эффект анимации на загруженном в окно изображении .bmp Анимация...

12
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
03.02.2020, 21:37  [ТС]
Первая ошибка была без face, на самом деле она такая:
Python
1
2
3
4
5
6
7
D:\Python\python.exe C:/demo4/opencv_demo4.py
Traceback (most recent call last):
  File "C:/demo4/opencv_demo4.py", line 9, in <module>
    recognizer = cv2.face.LBPHFaceRecognizer_create()
AttributeError: module 'cv2' has no attribute 'face'
 
Process finished with exit code 1
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
03.02.2020, 23:02
Цитата Сообщение от БузинВладимир Посмотреть сообщение
AttributeError: module 'cv2' has no attribute 'LBPHFaceRecognizer_create'
Попробуйте pip install opencv-contrib-python
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
04.02.2020, 13:19  [ТС]
Библиотеку поставил, но пошли другие ошибки, связанные с 29 и 21 строками:
Python
1
2
3
4
5
6
7
8
9
10
11
D:\Python\python.exe C:/demo4/opencv_demo4.py
 
 [INFO] Training faces. It will take a few seconds. Wait ...
Traceback (most recent call last):
  File "C:/demo4/opencv_demo4.py", line 29, in <module>
    faces, ids = getImagesAndLabels(path)
  File "C:/demo4/opencv_demo4.py", line 21, in getImagesAndLabels
    id = int(os.path.split(imagePath)[-1].split(".")[1])
ValueError: invalid literal for int() with base 10: 'Vladimir'
 
Process finished with exit code 1
Код программы:
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
import cv2
import numpy as np
from PIL import Image
import os
 
# Path for face image database
path = 'dataset'
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
 
# function to get the images and label data
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    faceSamples=[]
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L')
        # convert it to grayscale
        img_numpy = np.array(PIL_img, 'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faces = detector.detectMultiScale(img_numpy)
        for (x, y, w, h) in faces:
            faceSamples.append(img_numpy[y:y+h, x:x+w])
            ids.append(id)
    return faceSamples, ids
 
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces, ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
 
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml')
# recognizer.save() worked on Mac, but not on Pi
 
# Print the numer of faces trained and end program
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))
Vladimir - это имя человека, фотографии которого помещаются в dataset на предыдущем шаге.

Добавлено через 5 часов 56 минут
Ура! При id=7 yml-образ создался!

Добавлено через 9 минут
Но как сделать, чтобы выводимое над зелёной рамкой имя бралось из учётной записи Microsoft или локальной записи пользователя Windows 10?
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
04.02.2020, 14:25
Цитата Сообщение от БузинВладимир Посмотреть сообщение
выводимое над зелёной рамкой имя
Имя пользователя можно получить так

Python
1
2
import getpass
name = getpass.getuser()
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
05.02.2020, 05:53  [ТС]
Скорее всего, компилятор не смог считать имя пользователя, потому что оно кириллическое (над рамкой появились вопросительные знаки). Когда написал на седьмом месте в массиве Vladimir - имя вывелось нормально. Есть ли в Python функция, включающая русскую раскладку подобно сишной setlocale из библиотеки <locale.h>?

Код программы:
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 getpass
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', 'Oksana', getpass.getuser()]
 
# 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()
    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()
Миниатюры
Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow   Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow  
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
05.02.2020, 07:01  [ТС]
Ещё я попробовал пример в этих лекциях
https://www.intuit.ru/studies/... 985?page=2
Но столкнулся с тем, что подмодуль cv и константа CV_HAAR_SCALE_IMAGE были удалены из OpenCV 3.0. Попробовал CASCADE_SCALE_IMAGE, но не помогло ни с одинарным, ни с удвоенным cv. Какой аналог этих констант есть в OpenCV 4.1.2?

Код программы:
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
import sys, cv2 as cv
 
cap = cv.VideoCapture(0)
cascade = cv.CascadeClassifier(
    "lbpcascade_frontalface.xml")
# Загрузка обученного каскадного классификатора
while True:
    ok, img = cap.read()
    if not ok:
        break
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    sf = min(640. / img.shape[1], 480. / img.shape[0])
    gray = cv.resize(gray, (0, 0), None, sf, sf)
    # Масштабирование
    rects = cascade.detectMultiScale(gray, scaleFactor=1.3,
                                     minNeighbors=4, minSize=(40, 40),
                                     flags=cv.CASCADE_SCALE_IMAGE)
    #Детектирование
    gray = cv.GaussianBlur(gray, (3, 3), 1.1)
    # Размываем
    edges = cv.Canny(gray, 5, 50)  # Детектируем ребра
 
    out = cv.cvtColor(edges, cv.COLOR_GRAY2BGR)
    for x, y, w, h in rects:
        cv.rectangle(out, (x, y), (x + w, y + h), (0, 0, 255), 2)
        # Вокруг найденного лица
        # рисуем красный прямоугольник
    cv.imshow("edges+face", out)
    if cv.waitKey(30) > 0:
        break
Ошибка для одинарного cv:
Python
1
2
3
4
5
6
7
8
9
D:\Python\python.exe C:/demo5/opencv_demo5.py
Traceback (most recent call last):
  File "C:/demo5/opencv_demo5.py", line 17, in <module>
    flags=cv.CASCADE_SCALE_IMAGE)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
 
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
 
Process finished with exit code 1
Ошибка для двойного cv:
Python
1
2
3
4
5
6
7
8
D:\Python\python.exe C:/demo5/opencv_demo5.py
Traceback (most recent call last):
  File "C:/demo5/opencv_demo5.py", line 17, in <module>
    flags=cv.cv.CASCADE_SCALE_IMAGE)
AttributeError: module 'cv2.cv2' has no attribute 'cv'
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
 
Process finished with exit code 1
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
05.02.2020, 07:13  [ТС]
Всё сработало, просто забыл перекинуть в проект нужный xml.
Миниатюры
Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow  
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
09.02.2020, 17:48  [ТС]
Я решил написать вторую версию распознавателя, где данные берутся из MySQL, и сделал её с использованием pymysql, но знания pymysql и OpenCV 3.0+ хромают. Я подгонял под нужную мне СУБД и версию OpenCV коды с этого сайта:
https://dev.to/pranay749254/si... and-opencv
Причём, первые два благополучно создали фотки и yml-образ, но на этапе распознавания начались проблемы с выводом данных на экран: программа чуть-чуть подвигалась, а потом зависла и выдала ошибки, связанные с putText и индексами строки profile. Сначала попробовал ключи, соответствующие названиям столбцов, на что компилятор "сказал", что нужны значения числового, а не кортежного типа, потом попробовал индексы с цифрами, как в примерах, но появилась ошибка, причину которой я не знаю. Как правильно из БД извлечь строки и разбить их по нужным ключам, а потом передать их в putText?

insert_or_update.py
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
import cv2
import numpy as np
import pymysql
from pymysql.cursors import DictCursor
 
faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam = cv2.VideoCapture(0);
 
def insertOrUpdate(Id, Name, Age, Gen, CR):
    conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4', cursorclass=DictCursor)
    with conn.cursor() as cursor:
        cmd = "SELECT * FROM people WHERE ID=%s"
        cursor.execute(cmd, Id)
        count_row = cursor.rowcount
 
    if (count_row > 0):
        with conn.cursor() as cursor:
            cmd = "UPDATE people SET Name=%s, Age=%s, Gender=%s, CR=%s WHERE ID=%s"
            cursor.execute(cmd, (Name, Age, Gen, CR, Id))
            conn.commit()
    else:
        with conn.cursor() as cursor:
            cmd = "INSERT INTO people(ID, Name, Age, Gender, CR) Values(%s, %s, %s, %s, %s)"
            cursor.execute(cmd, (Id, Name, Age, Gen, CR))
            conn.commit()
 
    conn.close()
 
Id = input('Enter User Id')
name = input('Enter User Name')
age = input('Enter User Age')
gen = input('Enter User Gender')
cr = input('Enter User Criminal Records')
insertOrUpdate(Id, name, age, gen, cr)
sampleNum = 0
while(True):
    ret, img = cam.read();
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceDetect.detectMultiScale(gray, 1.3, 5);
    for(x, y, w, h) in faces:
        sampleNum = sampleNum + 1;
        cv2.imwrite("dataSet/User." + str(Id) + "." + str(sampleNum) + ".jpg", gray[y:y+h, x:x+w])
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        cv2.waitKey(100);
    cv2.imshow("Face", img);
    cv2.waitKey(1);
    if(sampleNum > 20):
        break;
 
cam.release()
cv2.destroyAllWindows()
recognition.py
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
import cv2
import numpy as np
import os
import pymysql
from pymysql.cursors import DictCursor
 
faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam = cv2.VideoCapture(0);
rec = cv2.face.LBPHFaceRecognizer_create();
rec.read("recognizer/trainningData.yml")
font = cv2.FONT_HERSHEY_SIMPLEX
 
def getProfile(id):
    conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4', cursorclass=DictCursor)
    with conn.cursor() as cursor:
        cmd = "SELECT * FROM people WHERE ID=%s"
        cursor.execute(cmd, id)
        rows = cursor.fetchall()
        profile = None
        for row in rows:
            profile = row
    conn.close()
    return profile
 
while(True):
    ret, img = cam.read();
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceDetect.detectMultiScale(gray, 1.3, 5);
    for(x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        id, conf = rec.predict(gray[y:y+h, x:x+w])
        profile = getProfile(id)
        if(profile != None):
            cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
            cv2.putText(img, "Age : " + str(profile[2]), (x, y+h+45), font, (0, 255, 0), 2);
            cv2.putText(img, "Gender : " + str(profile[3]), (x, y+h+70), font, (0, 255, 0), 2);
            cv2.putText(img, "Criminal Records : " + str(profile[4]), (x, y+h+95), font, (0, 0, 255), 2);
    cv2.imshow("Face", img);
    if(cv2.waitKey(1)==ord('q')):
        break;
cam.release()
cv2.destroyAllWindows()
Ошибки:
Python
1
2
3
4
5
6
7
8
D:\Python\python.exe C:/face_detection_mysql/recognition.py
Traceback (most recent call last):
  File "C:/face_detection_mysql/recognition.py", line 34, in <module>
    cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
KeyError: 1
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
 
Process finished with exit code -805306369 (0xCFFFFFFF)
Миниатюры
Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow   Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow   Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow  

Обработка растровых изображений с применением библиотеки OpenCV: проблемы с LBPHFaceRecognizer и библиотекой pillow  
Изображения
 
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
09.02.2020, 17:53  [ТС]
training.py
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
import os
import cv2
import numpy as np
from PIL import Image
 
recognizer = cv2.face.LBPHFaceRecognizer_create();
path = 'dataSet'
 
def getImagesWithID(path):
    imagepaths = [os.path.join(path, f) for f in os.listdir(path)]
    faces=[]
    IDs=[]
    for imagepath in imagepaths:
        faceImg = Image.open(imagepath).convert('L');
        faceNp = np.array(faceImg, 'uint8')
        ID = int(os.path.split(imagepath)[-1].split('.')[1])
        faces.append(faceNp)
        IDs.append(ID)
        cv2.imshow("training", faceNp)
        cv2.waitKey(10)
    return np.array(IDs), faces
 
IDs, faces = getImagesWithID(path)
recognizer.train(faces, IDs)
recognizer.write('recognizer/trainningData.yml')
cv2.destroyAllWindows()
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
10.02.2020, 13:19  [ТС]
Просто вывести строку могу, а присвоить profile, вернуть из функции и поместить в putText - нет, так как нужен тип действительных чисел вместо кортежа.

test_output.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2
import numpy as np
import os
import pymysql
 
def getProfile(id):
    conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4')
    with conn.cursor() as cursor:
        cmd = "SELECT * FROM people WHERE ID=%s"
        cursor.execute(cmd, id)
        for row in cursor:
            print(row)
    conn.close()
 
getProfile(1)
Результат:
Python
1
2
3
4
D:\Python\python.exe C:/face_detection_mysql/test_output.py
(1, 'Vladimir', 23, 'M', 'None')
 
Process finished with exit code 0
recognition.py
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
import cv2
import numpy as np
import os
import pymysql
 
faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam = cv2.VideoCapture(0);
rec = cv2.face.LBPHFaceRecognizer_create();
rec.read("recognizer/trainningData.yml")
font = cv2.FONT_HERSHEY_SIMPLEX
 
def getProfile(id):
    conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4')
    with conn.cursor() as cursor:
        cmd = "SELECT * FROM people WHERE ID=%s"
        cursor.execute(cmd, id)
        profile = None
        for row in cursor:
            profile = row
    conn.close()
    return profile
 
while(True):
    ret, img = cam.read();
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceDetect.detectMultiScale(gray, 1.3, 5);
    for(x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        id, conf = rec.predict(gray[y:y+h, x:x+w])
        profile = getProfile(id)
        if(profile != None):
            cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
            cv2.putText(img, "Age : " + str(profile[2]), (x, y+h+45), font, (0, 255, 0), 2);
            cv2.putText(img, "Gender : " + str(profile[3]), (x, y+h+70), font, (0, 255, 0), 2);
            cv2.putText(img, "Criminal Records : " + str(profile[4]), (x, y+h+95), font, (0, 0, 255), 2);
    cv2.imshow("Face", img);
    if(cv2.waitKey(1)==ord('q')):
        break;
cam.release()
cv2.destroyAllWindows()
Результат:
Python
1
2
3
4
5
6
7
8
D:\Python\python.exe C:/face_detection_mysql/recognition.py
Traceback (most recent call last):
  File "C:/face_detection_mysql/recognition.py", line 32, in <module>
    cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
TypeError: must be real number, not tuple
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
 
Process finished with exit code -805306369 (0xCFFFFFFF)
Добавлено через 5 минут
Как вернуть массив строк, если в видеопотоке будет несколько лиц?

Добавлено через 9 минут
Также я путаюсь в этих индексах - почему к элементам массива profile нельзя обратиться по названиям столбцов?

Добавлено через 3 часа 57 минут
Попробовал раскидать значения ключей строки по разным переменным с помощью fetchone - та же проблема: просто вывести могу, а загнать в putText - нет по той же самой причине. Даже явное преобразование в строку посредством str() не помогло.

recognition.py
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
import cv2
import numpy as np
import os
import pymysql
 
faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam = cv2.VideoCapture(0);
rec = cv2.face.LBPHFaceRecognizer_create();
rec.read("recognizer/trainningData.yml")
font = cv2.FONT_HERSHEY_SIMPLEX
 
def getProfile(id):
    conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4')
    name = None
    age = None
    gen = None
    cr = None
    with conn.cursor() as cursor:
        cmd = "SELECT * FROM people WHERE ID=%s"
        cursor.execute(cmd, id)
        id, name, age, gen, cr = cursor.fetchone()
    conn.close()
    return id, name, age, gen, cr
 
while(True):
    ret, img = cam.read();
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceDetect.detectMultiScale(gray, 1.3, 5);
    for(x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        id, conf = rec.predict(gray[y:y+h, x:x+w])
        id, name, age, gen, cr = getProfile(id)
        if(name != None and age != None and gen != None and cr != None):
            cv2.putText(img, "Name : " + str(name), (x, y+h+20), font, (0, 255, 0), 2);
            cv2.putText(img, "Age : " + str(age), (x, y+h+45), font, (0, 255, 0), 2);
            cv2.putText(img, "Gender : " + str(gen), (x, y+h+70), font, (0, 255, 0), 2);
            cv2.putText(img, "Criminal Records : " + str(cr), (x, y+h+95), font, (0, 0, 255), 2);
    cv2.imshow("Face", img);
    if(cv2.waitKey(1)==ord('q')):
        break;
cam.release()
cv2.destroyAllWindows()
Ошибки:
Python
1
2
3
4
5
6
7
8
D:\Python\python.exe C:/face_detection_mysql/recognition.py
Traceback (most recent call last):
  File "C:/face_detection_mysql/recognition.py", line 34, in <module>
    cv2.putText(img, "Name : " + str(name), (x, y+h+20), font, (0, 255, 0), 2);
TypeError: must be real number, not tuple
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
 
Process finished with exit code -805306369 (0xCFFFFFFF)
test_output.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2
import numpy as np
import os
import pymysql
 
def getProfile(id):
    conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4')
    with conn.cursor() as cursor:
        cmd = "SELECT * FROM people WHERE ID=%s"
        cursor.execute(cmd, id)
        for row in cursor:
            print(row)
    conn.close()
 
getProfile(1)
Результат:
Python
1
2
3
4
D:\Python\python.exe C:/face_detection_mysql/test_output.py
1 Vladimir 23 M None
 
Process finished with exit code 0
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
11.02.2020, 05:22  [ТС]
Ах вот где ошибка - оказывается, я в putText после типа шрифта и перед цветом единичку не поставил.
https://stackoverflow.com/ques... -detection
0
0 / 0 / 0
Регистрация: 08.05.2020
Сообщений: 1
08.05.2020, 19:47
БузинВладимир, Владимир, выручите пожалуйста, нужно сдавать диплом, но я никак не настрою простое распознавание... пытался установить opencv на ubuntu и запустить хоть чей-нибудь мануал - тщетно... Я посмотрел, вы на windows делали. Можете помочь в скайпе или в дискорде? Пожалуйста, очень прошу
Discord - stas_01_07#6734
Skype - stas_01_07
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2020, 19:47
Помогаю со студенческими работами здесь

Обработка растровых изображений. Фильтры. (PascalABC)
Сделал программу которая должна накладывать фильтр на изображение по образцу (), с 4 страницы начиная. Код выполняется, а желаемого...

Python 3 pillow групповая обработка изображений
:) всем привет создал скрипт который вставляет маленькие картинки в большие полотна вот такой повторяющийся текст from PIL...

Обработка растровых изображений с регулировкой яркости,контрастности и резкости
Обработка растровых изображений с регулировкой яркости,контрастности и резкости. Надо открыть изображение формата bmp 24-32битное,как то...

OpenCV/C++ обработка изображений
В общем задача следующая, есть изображение(бинарное), подсчитать кол-во объектов т.е изначально нужно его промаркировать. Использовал...

Проблемы при установке библиотеки OpenCV
Доброго времени суток. Я использую последнюю версию ОС Windows 10, пишу код в PyCharm-е. При установке библиотеки opencv-python, не важно,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru