Добавь к коду обрезку найденного QR CODE и данную картинку прогони через zbar библиотеку чтобы потвердить что там реально QR CODE а так же результат в виде булево добавить f.write(f"{model.name};{elapsed_time:.2f};{confidence:.2f};{filename}\n")

from ultralytics import YOLO
import cv2
import os
import time
from pyzbar import pyzbar

def load_yolo_model(weights_path):
    model = YOLO(weights_path)
    model.name = os.path.splitext(os.path.basename(weights_path))[0]
    return model

def detect_objects(model, image_path):
    start_time = time.time()
    results = model(image_path)
    end_time = time.time()
    
    elapsed_time = end_time - start_time
    return results, elapsed_time

def resize_to_hd_with_aspect_ratio(image):
    original_height, original_width = image.shape[:2]
    target_aspect_ratio = 1280 / 720
    img_aspect_ratio = original_width / original_height
    
    if img_aspect_ratio > target_aspect_ratio:
        # Изображение шире, чем целевое соотношение сторон
        new_width = 1280
        new_height = int(new_width / img_aspect_ratio)
    else:
        # Изображение выше, или точно то же соотношение, чем целевое
        new_height = 720
        new_width = int(new_height * img_aspect_ratio)
    
    # Изменяем размер изображения, сохраняя аспектное соотношение
    image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)
    
    # Вычисляем отступы
    top_pad = (720 - new_height) // 2
    bottom_pad = 720 - new_height - top_pad
    left_pad = (1280 - new_width) // 2
    right_pad = 1280 - new_width - left_pad
    
    # Добавляем черные поля, чтобы заполнить до 1280x720
    image_padded = cv2.copyMakeBorder(image, top_pad, bottom_pad, left_pad, right_pad, cv2.BORDER_CONSTANT, value=[0, 0, 0])
    
    return image_padded

def save_results(image_path, results, output_dir, output_filename):
    os.makedirs(output_dir, exist_ok=True)  # Обеспечиваем, что директория существует
    image = cv2.imread(image_path)
    
    for result in results:
        boxes = result.boxes
        for box in boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0])
            confidence = box.conf[0]
            class_id = int(box.cls[0])
            label = f"{result.names[class_id]}: {confidence:.2f}"

            cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
    # Изменяем размер изображения с учетом пропорций
    image = resize_to_hd_with_aspect_ratio(image)

    output_image_path = os.path.join(output_dir, output_filename)
    cv2.imwrite(output_image_path, image)
    print(f"Results saved to {output_image_path}")

def process_directory(input_dir, yolo_models, output_dir, output_base_path, log_file):
    with open(log_file, 'a') as f:  # Открытие файла в режиме добавления
        for filename in os.listdir(input_dir):
            image_path = os.path.join(input_dir, filename)

            # Проверяем, что файл является изображением
            if os.path.isfile(image_path) and filename.lower().endswith(('.png', '.jpg', '.jpeg')):
                for model in yolo_models:
                    results, elapsed_time = detect_objects(model, image_path)

                    print(f"Processing {filename} with model {model.name}...")
                    print(f"Time taken: {elapsed_time:.2f} seconds")
                    for result in results:
                        boxes = result.boxes
                        for box in boxes:
                            class_id = box.cls[0]
                            confidence = box.conf[0]

                            # Проверяем уверенность и соответствие классу QR-кода
                            #if confidence > 0.65:
                            f.write(f"{model.name};{elapsed_time:.2f};{confidence:.2f};{filename}\n")
                            print(f"Label: {result.names[int(class_id)]}, Confidence: {confidence:.2f}")

                    model_name = model.name.replace(" ", "_")
                    output_filename = f"{output_base_path}_{model_name}_{filename}"
                    save_results(image_path, results, output_dir, output_filename)

# Загрузка моделей
yolo_models = [
    load_yolo_model("best_8n.pt"),
    load_yolo_model("best_9t.pt"),
    load_yolo_model("best_9s.pt"),
    load_yolo_model("best_10n.pt"),
    load_yolo_model("best_10s.pt"),
    load_yolo_model("best_11n.pt"),
    load_yolo_model("best_11s.pt"),
    load_yolo_model("qrdet-n.pt"),
    load_yolo_model("qrdet-s.pt"),
    load_yolo_model("qrdet-s0.pt"),
    load_yolo_model("qrdet-m.pt")
]

# Путь к изображению и базовый путь для сохранения
input_directory = "input"
output_directory = "output"
output_base_path = "model"

# Файл для сохранения логов
log_file = "detection_results.txt"

process_directory(input_directory, yolo_models, output_directory, output_base_path, log_file)