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

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

Код программы:

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’

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

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")

Само создание таблицы с полями

CREATE TABLE new_tt
(id INTEGER PRIMARY KEY, 
name TEXT NOT NULL, 
photo BLOB NOT NULL, 
resume BLOB NOT NULL);

Так а что именно непонятно?
Делайте SELECT запрос к БД.
sqlite3 — DB-API 2.0 interface for SQLite databases — Python 3.9.7 documentation
SQLite Python: Select Data from A Table

Не понимаю, как именно запрос сделать, когда путь к папке это одно, там все понятно и легко, но вот когда нужно чтобы он брал фото из базы, не очень понимаю сам запрос

SELECT photo FROM new_tt

В photo будут байты картинки, возможно надо разбираться как их конвертировать в нужный вид для imdecode

Вообще в БД часто хранят не блобы, а просто пути относительно какой-то папки, где эти файлы лежат.

А если на моем примере, то как будет выглядеть запрос, который будет содержать путь папки, где файлы лежать

Дык откуда тут пути возьмутся.
Тогда надо в БД вместо

хранить путь.

Тип данных TEXT и убрать convert_to_binary_data.

Не очень понимаю, то есть будет photo Text not null, а сам путь то куда прописывать к примеру возьмем C:\Users путь будет к фото. Нужно все фото в одной папке к примеру, или как нужно указывать, какое фото будет для каждого человека, прописывать 5 путей?

Ну это от задачи зависит. Обычно файлы хранятся в определенной папке (копируются туда), например, папка files рядом с программой/БД. И в БД хранится только путь относительно этой папки (то есть например просто имя файла).

1 лайк

Где код реализации детектирования хотя-бы фейса, не то что конкретного человека?
Без детектирования не получится. Какая бы база с фотками ни была.
Я вижу это так:
детектим фейс в покадровой обработке стрима;
сравниваем с фотками в базе.

Или идем от обратного:
есть фотка фейса;
определяем указатель на память где разместилась фотка;
сравниваем полученные кадры из стрима с указателем…