Считывание данных из Таблицы БД

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
у меня такой вопрос, создал таблицу в БД SQLite, занес туда данные + фото. Сейчас программа считывает фото из папки, хочу реализовать, чтобы теперь после создание БД, при запуске программы, данные считывались из таблицы, а точнее имя фотографии. То есть суть программы, при запуске, включается веб камера и определяет человека, сейчас фото хранятся в папке, она все определяет прекрасно, но вот когда загрузил в бд, не могу понять, как сделать, чтобы она теперь из БД брала фото и так же сравнивала. Буду благодарен за любую помощь

Код программы:
Python:
import winsound
    import numpy as np
    import face_recognition
    import cv2
    import os
    from PIL import ImageFont, ImageDraw, Image
    import FindCloneApi
    from datetime import datetime
    
    path = 'KnownFaces'
    images = []
    classNames = []
    
    cap = cv2.VideoCapture(0)
    frequency = 2500  # Set Frequency To 2500 Hertz
    duration = 1000  # Set Duration To 1000 ms == 1 second
    winsound.Beep(frequency, duration)
    def face_detect():
        myList = os.listdir(path)
        print(myList)
    
        for cls in myList:
            curImg = cv2.imdecode(np.fromfile(f'{path}/{cls}', dtype=np.uint8), cv2.IMREAD_COLOR)
            images.append(curImg)
            classNames.append(os.path.splitext(cls)[0])
    
        print(classNames)
    
        def findEncodings(images):
            encodeList = []
            for img in images:
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                encode = face_recognition.face_encodings(img)[0]
                encodeList.append(encode)
            return encodeList
    
        def markAttendance(name):
            with open("Attendance.csv", "r+") as f:
                myDataList = f.readlines()
                nameList = []
                for line in myDataList:
                    entry = line.split(',')
                    nameList.append(entry[0])
                if name not in nameList:
                    now = datetime.now()
                    dtString = now.strftime("%H:%M:%S")
                    f.writelines(f'\n{name}, {dtString}')
    
        encodeListKnown = findEncodings(images)
        print("Декодирование закончено")
    
    
    
        while True:
            success, img = cap.read()
            imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
            imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
    
            facesCurFrame = face_recognition.face_locations(imgS)
            encodeCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)
    
            for encodeFace, faceLoc in zip(encodeCurFrame, facesCurFrame):
                matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
                faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
                print(faceDis)
                matchIndex = np.argmin(faceDis)
    
                name = 'Unknown'
    
                if matches[matchIndex]:
                    name = classNames[matchIndex]
                    print(name)
                    y1, x2, y2, x1 = faceLoc
                    y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
                    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
                    cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
                    cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
                    markAttendance(name)
                else:
                    filename = 'KnownFaces/face.jpg'
                    cv2.imwrite(filename, img)
                    print("Лицо сохранено")
                    #find_clone(filename)
    
    
    
            cv2.imshow("WebCam", img)
            cv2.waitKey(1)
    
    def find_clone(img):
        find = FindCloneApi.FindCloneAPI()
        find.login()
        find.upload(img)
        name = 'KnownFaces/' + str(find.out()) + '.jpg'
        os.rename(img, name)
        face_detect()
    
    face_detect()


Сейчас путь указан к папке path = 'KnownFaces'

Вот код соединения и создание таблицы, все создается прекрасно, фото загружаются.

Python:
 import sqlite3
    
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    
    
    
    
    def convert_to_binary_data(filename):
        # Преобразование данных в двоичный формат
        with open(filename, 'rb') as file:
            blob_data = file.read()
        return blob_data
    
    def insert_blob(emp_id, name, photo, resume_file):
        try:
            sqlite_connection = sqlite3.connect('rr.db')
            cursor = sqlite_connection.cursor()
            print("Подключен к SQLite")
    
            sqlite_insert_blob_query = """INSERT INTO new_tt
                                      (id, name, photo, resume) VALUES (?, ?, ?, ?)"""
    
            emp_photo = convert_to_binary_data(photo)
            resume = convert_to_binary_data(resume_file)
            # Преобразование данных в формат кортежа
            data_tuple = (emp_id, name, emp_photo, resume)
            cursor.execute(sqlite_insert_blob_query, data_tuple)
            sqlite_connection.commit()
            print("Изображение и файл успешно вставлены как BLOB в таблиу")
            cursor.close()
    
        except sqlite3.Error as error:
            print("Ошибка при работе с SQLite", error)
        finally:
            if sqlite_connection:
                sqlite_connection.close()
                print("Соединение с SQLite закрыто")
    
    insert_blob(1, "Вадим", "Вадим.jpg", "resume_Vadim.docx")
    insert_blob(2, "Костя", "Костя.jpg", "resume_Vadim.docx")


Само создание таблицы с полями
SQL:
 CREATE TABLE new_tt
    (id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    photo BLOB NOT NULL,
    resume BLOB NOT NULL);
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Здравствуйте, такой вот еще вопрос, хочу создать в таблице поле, в котором будет идентификатор, к примере называться поле будет статус, если статус указан 1, то это студент, если статус будет 2, то это преподаватель, сейчас он с базы сравнивает фото и все прекрасно работает при запуске программы. Теперь хотелось бы реализовать так, если статус к примеру 1, то рамка при распознавании лица зеленого цвета, если к примеру 2 то фиолетового цвета, вообще цвет не важен, а если человека нет в базе, то красного цвета и думаю чтобы писал UnKnown, я пытался это сделать присвоить name = Unknown, но он не работает. Лучше присваивать значении к примеру студент, препод, или лучше просто цифрами?
 
Последнее редактирование:

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
SQL:
cur.execute("""CREATE TABLE IF NOT EXISTS `new_tt`(
`id` INTEGER PRIMARY KEY,
`name` TEXT NOT NULL,
`photo` BLOB NOT NULL,
`resume` BLOB NOT NULL);
""")


Вместо resume будет поле status

SQL:
cur.execute("""CREATE TABLE IF NOT EXISTS `new_tt`(
`id` INTEGER PRIMARY KEY,
`name` TEXT NOT NULL,
`photo` BLOB NOT NULL,
`status` INT NOT NULL);
""")


Если мне память не изменяет, то цвет рамки задается тут

Python:
 while True:
        success, img = cap.read()
        imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
        imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
хочу создать в таблице поле, в котором будет идентификатор, к примере называться поле будет статус, если статус указан 1, то это студент, если статус будет 2, то это преподаватель
Можно удалить базу и пересоздать с новыми полями (статус вместо резюме):
Python:
cursor.execute("CREATE TABLE IF NOT EXISTS `new_tt` (`id` INTEGER PRIMARY KEY, `name` TEXT NOT NULL, `photo` BLOB NOT NULL, `status` INT NOT NULL);")
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Теперь хотелось бы реализовать так, если статус к примеру 1, то рамка при распознавании лица зеленого цвета, если к примеру 2 то фиолетового цвета
Просто нужно получать статус из базы и в соответствии с ним менять цвет рамки.
Python:
def face_detect():
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT name, photo, status FROM new_tt""")

    data = c.fetchall()

    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'),
                              cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)

        if status == 1:
            print('Рисуем красную рамку')
        elif status == 2:
            print('Рисуем зеленую рамку')
        else:
            print('Рисуем синюю рамку')

    print(classNames)
    print(images)

    conn.close()
 
Последнее редактирование:

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Просто нужно получать статус из базы и в соответствии с ним менять цвет рамки.
Python:
def face_detect():
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT name, photo, status FROM new_tt""")

    data = c.fetchall()

    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'),
                              cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)

        if status == 1:
            print('Рисуем красную рамку')
        elif status == 2:
            print('Рисуем зеленую рамку')
        else:
            print('Рисуем синюю рамку')

    print(classNames)
    print(images)

    conn.close()


Хорошо, спасибо, попробую все сделать отпишусь обязательно!
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Просто нужно получать статус из базы и в соответствии с ним менять цвет рамки.
Python:
def face_detect():
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT name, photo, status FROM new_tt""")

    data = c.fetchall()

    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'),
                              cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)

        if status == 1:
            print('Рисуем красную рамку')
        elif status == 2:
            print('Рисуем зеленую рамку')
        else:
            print('Рисуем синюю рамку')

    print(classNames)
    print(images)

    conn.close()



Создал новую базу, код ниже:

Python:
import sqlite3

conn = sqlite3.connect('test.db')
cur = conn.cursor()


cur.execute("""CREATE TABLE IF NOT EXISTS `new_test`(
`id` INTEGER PRIMARY KEY,
`name` TEXT NOT NULL,
`photo` BLOB NOT NULL,
`status` INT NOT NULL);
""")
cur.close()
conn.close()

def convert_to_binary_data(filename):
    # Преобразование данных в двоичный формат
    with open(filename, 'rb') as file:
        blob_data = file.read()
    return blob_data

def insert_blob(emp_id, name, photo, status):
    try:
        sqlite_connection = sqlite3.connect('test.db')
        cursor = sqlite_connection.cursor()
        print("Подключен к SQLite")

        sqlite_insert_blob_query = """INSERT INTO new_test
                                  (id, name, photo, status) VALUES (?, ?, ?, ?)"""

        emp_photo = convert_to_binary_data(photo)

        # Преобразование данных в формат кортежа
        data_tuple = (emp_id, name, emp_photo, status)
        cursor.execute(sqlite_insert_blob_query, data_tuple)
        sqlite_connection.commit()
        print("Изображение и файл успешно вставлены как BLOB в таблиу")
        cursor.close()

    except sqlite3.Error as error:
        print("Ошибка при работе с SQLite", error)
    finally:
        if sqlite_connection:
            sqlite_connection.close()
            print("Соединение с SQLite закрыто")

#insert_blob(1, "Вадим", "Вадим.jpg", "1")
#insert_blob(2, "Кристина", "Кристина.jpg","2")



Так соединился с ней, код ниже

Python:
def face_detect():
    conn = sqlite3.connect('db/test.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT  name, photo, status FROM new_test""")

    data = c.fetchall()


    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'), cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)
        if status == 1:
            print('Рисуем фиолетовую рамку')
        elif status == 2:
            print('Рисуем зеленую рамку')
        else:
            print('Рисуем синюю рамку')


Но с полем status, вот смотрите, сейчас при запуске рамка зеленого цвета, но вот вопрос, если взять ваш код, то он же просто на консольке выводит цвет рамки, а вот как сделать чтобы при запуске, исходя из статуса менялся цвет рамки в самой программе?
 

Вложения

  • Безымянный.png
    Безымянный.png
    530,4 КБ · Просмотры: 5
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Но с полем status, вот смотрите, сейчас при запуске рамка зеленого цвета, но вот вопрос, если взять ваш код, то он же просто на консольке выводит цвет рамки, а вот как сделать чтобы при запуске, исходя из статуса менялся цвет рамки в самой программе?
Я в коде просто показал как достать status из базы и на основе него что-то делать.
Чтобы цвет рамки менялся нужно изменять его в этих строках в зависимости от статуса:
Python:
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Я в коде просто показал как достать status из базы и на основе него что-то делать.
Чтобы цвет рамки менялся нужно изменять его в этих строках в зависимости от статуса:
Python:
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)

Если вас не затруднит, поправить мой код под цвет рамки
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Если вас не затруднит, поправить мой код под цвет рамки
Для начала можно привязать статус к имени (например при помощи словаря).
Python:
statuses = {}

def face_detect():
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT name, photo, status FROM new_tt""")

    data = c.fetchall()

    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'),
                              cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)
        # заполняем словарь {'имя': 'статус'}
        statuses[name] = status

    conn.close()
потом в зависимости от имени получать статус и красить рамку в нужный цвет:
Python:
while True:
    success, img = cap.read()
    imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

    facesCurFrame = face_recognition.face_locations(imgS)
    encodeCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    for encodeFace, faceLoc in zip(encodeCurFrame, facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        print(faceDis)
        matchIndex = np.argmin(faceDis)

        name = 'Unknown'

        if matches[matchIndex]:
            name = classNames[matchIndex]
            print(name)
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4           
            current_status = statuses[name]
            color = (0, 255, 0)
            if current_status == 1:
                color = (0, 255, 0)
            elif current_status == 2:
                color = (255, 0, 0)
            else:
                color = (0, 0, 255)
            cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
            cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
            cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            markAttendance(name)
        else:
            filename = 'KnownFaces/face.jpg'
            cv2.imwrite(filename, img)
            print("Лицо сохранено")
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Для начала можно привязать статус к имени (например при помощи словаря).
Python:
statuses = {}

def face_detect():
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT name, photo, status FROM new_tt""")

    data = c.fetchall()

    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'),
                              cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)
        # заполняем словарь {'имя': 'статус'}
        statuses[name] = status

    conn.close()
потом в зависимости от имени получать статус и красить рамку в нужный цвет:
Python:
while True:
    success, img = cap.read()
    imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

    facesCurFrame = face_recognition.face_locations(imgS)
    encodeCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    for encodeFace, faceLoc in zip(encodeCurFrame, facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        print(faceDis)
        matchIndex = np.argmin(faceDis)

        name = 'Unknown'

        if matches[matchIndex]:
            name = classNames[matchIndex]
            print(name)
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4         
            current_status = statuses[name]
            color = (0, 255, 0)
            if current_status == 1:
                color = (0, 255, 0)
            elif current_status == 2:
                color = (255, 0, 0)
            else:
                color = (0, 0, 255)
            cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
            cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
            cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            markAttendance(name)
        else:
            filename = 'KnownFaces/face.jpg'
            cv2.imwrite(filename, img)
            print("Лицо сохранено")


Спасибо большое, я разобрался с кодом, все прекрасно работает, для меня вы Бог просто!

Еще возник один вопрос, сейчас задам
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Для начала можно привязать статус к имени (например при помощи словаря).
Python:
statuses = {}

def face_detect():
    conn = sqlite3.connect('rr.db')
    cur = conn.cursor()
    c = cur.execute("""SELECT name, photo, status FROM new_tt""")

    data = c.fetchall()

    for name, photo, status in data:
        curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'),
                              cv2.IMREAD_COLOR)
        images.append(curImg)
        classNames.append(name)
        # заполняем словарь {'имя': 'статус'}
        statuses[name] = status

    conn.close()
потом в зависимости от имени получать статус и красить рамку в нужный цвет:
Python:
while True:
    success, img = cap.read()
    imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

    facesCurFrame = face_recognition.face_locations(imgS)
    encodeCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    for encodeFace, faceLoc in zip(encodeCurFrame, facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        print(faceDis)
        matchIndex = np.argmin(faceDis)

        name = 'Unknown'

        if matches[matchIndex]:
            name = classNames[matchIndex]
            print(name)
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4          
            current_status = statuses[name]
            color = (0, 255, 0)
            if current_status == 1:
                color = (0, 255, 0)
            elif current_status == 2:
                color = (255, 0, 0)
            else:
                color = (0, 0, 255)
            cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
            cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
            cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            markAttendance(name)
        else:
            filename = 'KnownFaces/face.jpg'
            cv2.imwrite(filename, img)
            print("Лицо сохранено")


Вот в чем мой вопрос, сейчас если удаляю пользователя из Бд и запускаю программу, то ничего не происходит, то есть рамки нет, ничего нет, хотя вроде name = 'Unknown' написано, хотелось бы конечно, чтобы была рамка и так же текст Unknown
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот в чем мой вопрос, сейчас если удаляю пользователя из Бд и запускаю программу, то ничего не происходит, то есть рамки нет, ничего нет, хотя вроде name = 'Unknown' написано, хотелось бы конечно, чтобы была рамка и так же текст Unknown
Нужно добавить отрисовку рамки в ветку else:
Python:
 else:
    color = (255, 0, 0)
    cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
    cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
    cv2.putText(img, 'Unknown', (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
    filename = 'KnownFaces/face.jpg'
    cv2.imwrite(filename, img)
    print("Лицо сохранено")
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Нужно добавить отрисовку рамки в ветку else:
Python:
 else:
    color = (255, 0, 0)
    cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
    cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
    cv2.putText(img, 'Unknown', (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
    filename = 'KnownFaces/face.jpg'
    cv2.imwrite(filename, img)
    print("Лицо сохранено")

Добавил отрисовку, выдает ошибку

cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
UnboundLocalError: local variable 'x1' referenced before assignment
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
UnboundLocalError: local variable 'x1' referenced before assignment
Нужно еще эти строки добавить в else (перед отрисовкой рамки):
Python:
y1, x2, y2, x1 = faceLoc
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Нужно еще эти строки добавить в else (перед отрисовкой рамки):
Python:
y1, x2, y2, x1 = faceLoc
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
Благодарю вас, очень сильно помогаете мне, Я вам случаем не надоел с вопросами?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Я вам случаем не надоел с вопросами?
Есть вопросы - спрашивайте. Также старайтесь не просто копировать код, а разбираться как он работает. И пробуйте сначала решить самостоятельно.
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Есть вопросы - спрашивайте. Также старайтесь не просто копировать код, а разбираться как он работает. И пробуйте сначала решить самостоятельно.
Хорошо, с чем вы мне помогли, все понял, как, что и для чего нужно было
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Есть вопросы - спрашивайте. Также старайтесь не просто копировать код, а разбираться как он работает. И пробуйте сначала решить самостоятельно.

Вот еще такой вопрос, вот этот цикл, он почему-то очень сильно тормозит изображение, когда включается камера, если убрать цикл и сделать код, чтобы просто включалась камера, то никаких лагов нет, но если добавляю этот цикл, то начинает тормозить, то есть изображение начинает лагать, что можно с этим сделать или оставить как есть? WaitKey и так стоит значение 1.

Python:
    while True:
        success, img = cap.read()
        imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
        imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

        facesCurFrame = face_recognition.face_locations(imgS)
        encodeCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

        for encodeFace, faceLoc in zip(encodeCurFrame, facesCurFrame):
            matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
            faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
            print(faceDis)
            matchIndex = np.argmin(faceDis)

            name = 'Unknown'

            if matches[matchIndex]:
                name = classNames[matchIndex]
                print(name)
                y1, x2, y2, x1 = faceLoc
                y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
                current_status = statuses[name]
                color = (0, 255, 0)
                if current_status == 1:
                    color = (0, 255, 0)
                elif current_status == 2:
                    color = (255, 0, 0)
                else:
                    color = (0, 0, 255)
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
                cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
                cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
                markAttendance(name)

            else:
                y1, x2, y2, x1 = faceLoc
                y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
                color = (0, 0, 255)
                cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
                cv2.rectangle(img, (x1, y2 - 35), (x2, y2), color, cv2.FILLED)
                cv2.putText(img, 'Unknown', (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
                frequency = 2500  # Set Frequency To 2500 Hertz
                duration = 1000  # Set Duration To 1000 ms == 1 second
                winsound.Beep(frequency, duration)
                #filename = 'KnownFaces/face.jpg'
                #cv2.imwrite(filename, img)
                #print("Лицо сохранено")
                #find_clone(filename)

        cv2.imshow("WebCam", img)
        cv2.waitKey(1)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
вот этот цикл, он почему-то очень сильно тормозит изображение
Видимо потому что код из цикла должен обработать каждый кадр. Как ускорить не знаю. cv2.waitKey(1) это минимальное значение, то есть ожидание после обработки кадра составляет всего 1 миллисекунду.
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Видимо потому что код из цикла должен обработать каждый кадр. Как ускорить не знаю. cv2.waitKey(1) это минимальное значение, то есть ожидание после обработки кадра составляет всего 1 миллисекунду.
Это тоже понимаю, что 1 миллисекунда, меньше уже не сделать. У меня есть мысли, как ускорить, но переписывать код на с++, так как они гораздо быстрее чем Python, вообще нет желания.
 

Форум IT Специалистов