пожалуйста помогите с кодом на python

происходит ошибка

cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:196: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

код:

# Импортируем необходимые библиотеки
import cv2
import mediapipe as mp
import numpy as np
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume

# Создаем объекты для работы с камерой и обнаружения рук
cap = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

# Получаем доступ к устройству вывода звука
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(IAudioEndpointVolume._iid_, 7, None)
volume = interface.QueryInterface(IAudioEndpointVolume)

# Задаем минимальное и максимальное значение громкости
volMin = volume.GetVolumeRange()[0]
volMax = volume.GetVolumeRange()[1]

# Задаем минимальное и максимальное значение расстояния между пальцами
distMin = 50
distMax = 300

# Запускаем бесконечный цикл для обработки кадров
while True:
    # Читаем кадр из камеры
    success, img = cap.read()
    # Переводим кадр в формат RGB для обнаружения рук
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # Получаем результаты обнаружения рук
    results = hands.process(imgRGB)
    # Проверяем, есть ли руки на кадре
    if results.multi_hand_landmarks:
        # Проходим по всем обнаруженным рукам
        for handLms in results.multi_hand_landmarks:
            # Рисуем контуры рук на кадре
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
            # Получаем координаты указательного и большого пальцев
            x1, y1 = handLms.landmark[8].x, handLms.landmark[8].y
            x2, y2 = handLms.landmark[4].x, handLms.landmark[4].y
            # Преобразуем координаты в целые числа
            x1, y1 = int(x1 * img.shape[1]), int(y1 * img.shape[0])
            x2, y2 = int(x2 * img.shape[1]), int(y2 * img.shape[0])
            # Рисуем точки и линию между пальцами
            cv2.circle(img, (x1, y1), 10, (255, 0, 0), cv2.FILLED)
            cv2.circle(img, (x2, y2), 10, (255, 0, 0), cv2.FILLED)
            cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3)
            # Вычисляем расстояние между пальцами
            dist = np.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
            # Ограничиваем расстояние минимальным и максимальным значением
            dist = np.clip(dist, distMin, distMax)
            # Преобразуем расстояние в значение громкости
            vol = np.interp(dist, [distMin, distMax], [volMin, volMax])
            # Устанавливаем громкость в соответствии с расстоянием
            volume.SetMasterVolumeLevel(vol, None)
            # Выводим значение расстояния и громкости на кадре
            cv2.putText(img, f"Dist: {int(dist)}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
            cv2.putText(img, f"Vol: {int(vol)}", (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
    # Показываем кадр на экране
    cv2.imshow("Image", img)
    # Ждем нажатия клавиши Esc для выхода из цикла
    if cv2.waitKey(1) == 27:
        break
# Освобождаем ресурсы камеры и закрываем окно
cap.release()
cv2.destroyAllWindows()

не знаю, что делать. помогите пожалуйста


Ответы (1 шт):

Автор решения: Vladyslav

(это только мое предположение)

Ошибка связана с пустым кадром, который поступает в функцию cv2.cvtColor(). Возможно, это происходит из-за задержки в получении первого кадра от камеры. Для более надежной обработки нужно проверить, что кадр не пустой перед передачей его в функцию cv2.cvtColor().

while True:
    # Читаем кадр из камеры
    success, img = cap.read()

    if not success:
        print("Не удалось получить кадр. Проверьте камеру или обработку видеопотока.")
    break

# Переводим кадр в формат RGB только если кадр не пустой
    if img is not None:
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # Продолжайте вашу обработку изображения далее

  
→ Ссылка