пожалуйста помогите с кодом на 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)
# Продолжайте вашу обработку изображения далее