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

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
Возможно проблема в шрифте (у вас его нет на компьютере).
Попробуйте заменить
Python:
cv2.FONT_HERSHEY_DUPLEX
на
Код:
cv2.FONT_HERSHEY_COMPLEX

Это можно сделать также как и раньше с помощью переменной и условий. Статус хранится в self.profile['status']
Хорошо, спасибо, завтра отпишусь
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Возможно проблема в шрифте (у вас его нет на компьютере).
Попробуйте заменить
Python:
cv2.FONT_HERSHEY_DUPLEX
на
Код:
cv2.FONT_HERSHEY_COMPLEX

Это можно сделать также как и раньше с помощью переменной и условий. Статус хранится в self.profile['status']
Здравствуйте, с рамкой разобрался, сделал. Попытался нарисовать Canvas, ниже приведу код и скрин что получилось, если что-то не так, можно поправить, теперь как понимаю в этот Canvas, нужно чтобы выводилось фото, надеюсь тут на вашу помощь

Python:
canvas = tk.Canvas(root, width=180, height=180, bg="pink")
        canvas.place(x=270, y=15)



Вот скрин:
 

Вложения

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

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Возможно проблема в шрифте (у вас его нет на компьютере).
Попробуйте заменить
Python:
cv2.FONT_HERSHEY_DUPLEX
на
Код:
cv2.FONT_HERSHEY_COMPLEX

Это можно сделать также как и раньше с помощью переменной и условий. Статус хранится в self.profile['status']
Вы где?)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Занят был. Думал вы тут уже все написали.
теперь как понимаю в этот Canvas, нужно чтобы выводилось фото, надеюсь тут на вашу помощь
Давайте допишу код для вывода картинки и закончим на этом.
Сначала добавим импорты:
Python:
from PIL import Image
from PIL import ImageTk
import io
добавим в неизвестный профиль ключ для картинки
Python:
self.profile_unknown = {
    ...,
    'photo': None
}
добавим канву на форму
Python:
self.photo = tk.Canvas(self.root, width=200, height=200, bg='black')
self.photo.place(x=270, y=15)
в методе получения данных из базы (get_data_from_db) в профили также добавим фото:
Python:
self.data[index] = {
    ...,
    'photo': photo
}
в методе для вывода данных добавим вывод фото:
Python:
def show_data(self):
    """Метод для вывода данных в форму"""

    self.set_text(self.name_entry, text=self.profile['name'])
    self.set_text(self.lastname_entry, text=self.profile['lastname'])
    self.set_text(self.status_entry, text=self.profile['status'])
    self.set_text(self.city_entry, text=self.profile['city'])
    self.set_text(self.age_entry, text=self.profile['age'])
    self.set_text(self.gender_entry, text=self.profile['gender'])

    # если у профиля есть фото
    if self.profile['photo'] is not None:
        # делаем картинку
        image = Image.open(io.BytesIO(self.profile['photo']))
        # задаем ей размер 200 на 200 пикселей
        image = image.resize([200, 200])
        # преобразуем в PhotoImage
        img_tk = ImageTk.PhotoImage(image)
        # привязываем к канве
        self.photo.image = img_tk
        # выводим
        self.photo.create_image([0, 0], image=img_tk, anchor="nw")
    else:
        # если нет фото - то не показываем
        self.photo.image = None
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Занят был. Думал вы тут уже все написали.

Давайте допишу код для вывода картинки и закончим на этом.
Сначала добавим импорты:
Python:
from PIL import Image
from PIL import ImageTk
import io
добавим в неизвестный профиль ключ для картинки
Python:
self.profile_unknown = {
    ...,
    'photo': None
}
добавим канву на форму
Python:
self.photo = tk.Canvas(self.root, width=200, height=200, bg='black')
self.photo.place(x=270, y=15)
в методе получения данных из базы (get_data_from_db) в профили также добавим фото:
Python:
self.data[index] = {
    ...,
    'photo': photo
}
в методе для вывода данных добавим вывод фото:
Python:
def show_data(self):
    """Метод для вывода данных в форму"""

    self.set_text(self.name_entry, text=self.profile['name'])
    self.set_text(self.lastname_entry, text=self.profile['lastname'])
    self.set_text(self.status_entry, text=self.profile['status'])
    self.set_text(self.city_entry, text=self.profile['city'])
    self.set_text(self.age_entry, text=self.profile['age'])
    self.set_text(self.gender_entry, text=self.profile['gender'])

    # если у профиля есть фото
    if self.profile['photo'] is not None:
        # делаем картинку
        image = Image.open(io.BytesIO(self.profile['photo']))
        # задаем ей размер 200 на 200 пикселей
        image = image.resize([200, 200])
        # преобразуем в PhotoImage
        img_tk = ImageTk.PhotoImage(image)
        # привязываем к канве
        self.photo.image = img_tk
        # выводим
        self.photo.create_image([0, 0], image=img_tk, anchor="nw")
    else:
        # если нет фото - то не показываем
        self.photo.image = None

Спасибо вам огромное не передать словами, как помогли очень, прям безумно благодарен вам, попробую сделать, очень помогли, вы написали "Закончим на этом, вопросы то могу задать если еще будут или уже исчерпал лимит?" А так дописал Progress bar, сделал отдельный метод сообщения на экран и теперь при нажатии Get data, идет загрузка и по окончанию сообщение получаю в message box
 
Последнее редактирование:

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