Вот мой код:
```py
import os
import time
from PIL import Image
import bettercam
import threading
import pygame
from pynput import keyboard as pynput_keyboard

# Настройки
CAPTURE_KEY = 'l'  # Клавиша для начала/приостановки захвата
CAPTURE_INTERVAL = 0.5  # Интервал между снимками в секундах
FOV = 512  # Поле зрения (размер области захвата)
IMAGE_FOLDER = "images"

# Инициализация Pygame
pygame.mixer.init()
start_sound = pygame.mixer.Sound("start.mp3")
pause_sound = pygame.mixer.Sound("pause.mp3")
shutter_sound = pygame.mixer.Sound("camera.mp3")

def play_sound(sound):
    threading.Thread(target=sound.play).start()

class ScreenCapture:
    def __init__(self):
        self.is_capturing = False
        self.last_capture_time = 0
        self.last_number = self.get_last_image_number()
        self.camera = None
        self.setup_camera()
        self.running = True
        self.capture_thread = threading.Thread(target=self.capture_loop)
        self.capture_thread.daemon = True  # Поток завершится при выходе из программы

        # Слушатель клавиатуры
        self.listener = pynput_keyboard.Listener(on_press=self.on_press)
        self.listener.start()  # Запускаем слушатель в отдельном потоке

    def setup_camera(self):
        # Вычисление области захвата
        left = (1920 - FOV) // 2
        top = (1080 - FOV) // 2
        right = left + FOV
        bottom = top + FOV
        region = (left, top, right, bottom)

        # Инициализация камеры
        self.camera = bettercam.create(output_color="RGBA", device_idx=0, max_buffer_len=512)
        self.camera.start(region=region, target_fps=30)

    def get_last_image_number(self):
        if not os.path.exists(IMAGE_FOLDER):
            os.makedirs(IMAGE_FOLDER)
            return 0
        existing_images = [f for f in os.listdir(IMAGE_FOLDER) if f.endswith('.png')]
        if not existing_images:
            return 0
        numbers = []
        for f in existing_images:
            try:
                number = int(f.split('_')[1].split('.')[0])
                numbers.append(number)
            except (IndexError, ValueError):
                continue
        return max(numbers) if numbers else 0

    def toggle_capture(self):
        self.is_capturing = not self.is_capturing
        if self.is_capturing:
            play_sound(start_sound)
            print("Захват начат")
        else:
            play_sound(pause_sound)
            print("Захват приостановлен")

    def on_press(self, key):
        try:
            if key.char == CAPTURE_KEY:
                self.toggle_capture()
        except AttributeError:
            # Специальные клавиши (Shift, Ctrl и т.д.) не имеют атрибута char
            pass

    def start(self):
        print(f"Продолжаем с номера {self.last_number + 1}")
        self.capture_thread.start()
        try:
            while self.running:
                time.sleep(0.1)  # Основной поток просто ждет, пока не произойдет остановка
        except KeyboardInterrupt:
            self.stop()

    def capture_loop(self):
        try:
            while self.running:
                if self.is_capturing and (time.time() - self.last_capture_time >= CAPTURE_INTERVAL):
                    image = self.camera.get_latest_frame()
                    if image is not None:
                        self.last_number += 1
                        image_path = os.path.join(IMAGE_FOLDER, f"image_{self.last_number:04d}.png")
                        Image.fromarray(image).save(image_path)
                        play_sound(shutter_sound)  # Воспроизводим звук затвора
                        print(f"Сохранено изображение {self.last_number:04d}")
                        self.last_capture_time = time.time()
                    else:
                        print("Не удалось получить изображение от камеры")
                time.sleep(0.01)  # Снижение нагрузки на CPU
        except Exception as e:
            print(f"Ошибка в цикле захвата: {e}")
            self.stop()

    def stop(self):
        self.running = False
        if self.camera:
            self.camera.stop()
        pygame.mixer.quit()
        self.listener.stop()
        print("Программа завершена")


if __name__ == "__main__":
    # Задержка для переключения на целевую игру
    print("Переключитесь на целевое окно. Начало через 5 секунд...")
    play_sound(shutter_sound)  # Воспроизводим звук затвора
    time.sleep(5)
    play_sound(shutter_sound)  # Воспроизводим звук затвора
    capture = ScreenCapture()
    capture.start()
```
Убери из него абсолютно все, что связано с генерацией датасета. Оставь только часть, где берутся скриншоты.
Необходимо использовать `q = multiprocessing.JoinableQueue()` для того, чтобы создать процесс захвата изображений
```py
p1 = multiprocessing.Process(target=grab_process, args=(q,), daemon = True)
p1.start()
```

Сделай так, чтобы при помощи метода `img = q.get_nowait()` мы получали изображения в отдельном процессе, как показано выше.
Это очень важно, чтобы все работало МАКСИМАЛЬНО быстро и без задержек.

Напиши пожалуйста аккуратный и чистый код, чтобы я сразу разобрался. Спасибо!