Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python, opencv, videocapture - как сделать скриншот с видео? Помогите

Access Denied Мастер (1233), на голосовании 1 неделю назад
Видео получается из rstp потока от IP камеры, код совсем простой:
 import cv2 
cap = cv2.VideoCapture('rtsp://#######')
result, image = cap.read()
if result:
cv2.imwrite('screenshot.tmp.jpg', image)
Скриншот сохраняется, НО вот какой:Я попробовал просто включить видео в потоке. И да, оно начинается именно с такой ряби, ну то есть пока прогрузится буквально секунду.
Тогда я попробовал поставить задержку time.sleep(5), но это совсем не помогло и скриншот получается все равно таким "серым".
В чем причина? Помогите
Голосование за лучший ответ
Беспрекословный Эксперт Мыслитель (5795) 1 месяц назад
Чтобы решить эту проблему, вам необходимо убедиться, что поток видео полностью инициализирован, прежде чем вы сделаете снимок. Одно из возможных решений — читать из потока в цикле и проверять, не является ли полученный кадр первым полностью инициализированным кадром видеопотока.

Вот пример кода, который читает первые несколько кадров, прежде чем сохранить скриншот:
 import cv2 
import time

# Создаем объект VideoCapture для RTSP потока
cap = cv2.VideoCapture('rtsp://#######')

# Проверяем, открыт ли поток
if not cap.isOpened():
print("Ошибка: не удалось открыть видеопоток.")
exit()

# Читаем несколько первых кадров, чтобы поток "прогрелся"
for _ in range(10):
result, image = cap.read()
if not result:
print("Ошибка: не удалось получить кадр.")
break
time.sleep(0.1) # небольшая задержка для стабилизации потока

# Попытка сделать скриншот после "прогрева" потока
result, image = cap.read()
if result:
# Сохраняем скриншот
cv2.imwrite('screenshot.jpg', image)
print("Скриншот успешно сохранен.")
else:
print("Ошибка: не удалось сделать скриншот.")

# Освобождаем объект VideoCapture
cap.release()
Этот код пытается считать первые 10 кадров перед сохранением скриншота, что может помочь стабилизировать видеопоток. Также важно освободить объект VideoCapture по завершению работы с ним. Если это не решает проблему, возможно, вам потребуется добавить большее количество итераций для чтения кадров или дополнительную задержку.
Access DeniedМастер (1233) 1 месяц назад
огромное спасибо, весь день промучался
Беспрекословный Эксперт Мыслитель (5795) Access Denied, Обращайтесь, не забудьте пометить ответ как лучший - буду рад)
Похожие вопросы