Статья Автор: Деникина Наталья Владимировна

Обработка видеопотока

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

Источники видеопотока

  1. Камеры (веб-камеры и IP-камеры):

    • Веб-камеры подключаются непосредственно к компьютеру и могут быть доступны через локальные порты.
    • IP-камеры подключаются к сети и предоставляют видеопоток через IP-адрес и порт.
  2. Видеофайлы:

    • Обработку можно выполнять на видеозаписях, хранящихся локально на диске, или доступных по сети.

Основные функции OpenCV для обработки видео

  1. Чтение видеопотока:

    • cap = cv2.VideoCapture(0): Создает объект для захвата видео из файла или устройства захвата (например, веб-камеры).

      Использование индекса камеры  в cv2.VideoCapture(0)

      • Когда используется 0 в качестве аргумента для cv2.VideoCapture, это указывает на использование первой подключенной к компьютеру веб-камеры.
      • Индекс 0 означает, что OpenCV будет использовать первую доступную камеру по умолчанию. Если к компьютеру подключено несколько камер, вы можете использовать индексы 12, и т.д., чтобы выбрать другую камеру.
    • Если камера успешно открыта, объект cap может быть использован для захвата и обработки видеокадров в режиме реального времени.
    • Если камера не открылась (например, если она не подключена или используется другим приложением), cap.isOpened() вернет False
  2. Чтение кадров:

    • read_ok, frame = cap.read(): Считывает кадры из объекта захвата. Возвращает два значения: булево значение успеха и сам кадр.
  3. Отображение видео:

    • cv2.imshow(): Отображает кадры в окне.
    • cv2.waitKey(20) — это функция из библиотеки OpenCV, которая ждет нажатия клавиши в течение указанного времени в миллисекундах.
    • Если в течение этого времени не была нажата ни одна клавиша, функция возвращает -1.
       == 27 в нашем примере это обработка клавиши Esc, которая имеет код 27.
    • Число 20 указывает на то, что программа будет ждать нажатия клавиши в течение 20 миллисекунд.
      Эта задержка обеспечивает гладкое обновление кадров и позволяет скриптам на OpenCV работать в реальном времени.

Пример отображения видеопотока с веб-камеры

import cv2

# Создание объекта для захвата видео
cap = cv2.VideoCapture(0)  # 0 - индекс веб-камеры

while cap.isOpened():
    # Считывание кадров
    read_ok, frame = cap.read()
    
    if not read_ok:
        break
    
    # Отображение обработанного кадра
    cv2.imshow('Video Stream', frame)
    
    # Завершение работы по нажатию клавиши 'Esc'
    if cv2.waitKey(20) == 27:
        break

# Освобождение ресурсов
cap.release()
cv2.destroyAllWindows()


Пример отображения видеофайла

Пример файла для самостоятельной обработки:
Скачать

import cv2

# Создание объекта для захвата видео
cap = cv2.VideoCapture('example_video.mp4')  # Путь к видеофайлу

while cap.isOpened():
    # Считывание кадров
    read_ok, frame = cap.read()
    
    if not read_ok:
        break
    
    # Отображение обработанного кадра
    cv2.imshow('Video File', frame)
    
    # Завершение работы по нажатию клавиши 'Esc'
    if cv2.waitKey(20) == 27:
        break

# Освобождение ресурсов
cap.release()
cv2.destroyAllWindows()

 

Проверка задания в системе 

Проверка заданий в нашей системе будет производиться по такому алгоритму:

  1. Загрузка видеозаписи через входные данные.
  2. Определение и вывод определенного параметра или результата обработки, например, количества обнаруженных объектов, среднее значение пикселей и т.д.

Пример кода для проверки:

import cv2
import numpy as np
import base64
import os

def cv2_VideoCapture(b64_string):
    decoded_video_bytes = base64.b64decode(b64_string)
    temp_filename = f'{b64_string[:10]}.mp4'
    with open(temp_filename, 'wb') as video_file:
        video_file.write(decoded_video_bytes)
    return cv2.VideoCapture(temp_filename)

cap = cv2_VideoCapture(input())

while cap.isOpened():
    read_ok, frame = cap.read()
    if not read_ok:
        break
    
    # ваш код для обработки видео
    
cap.release()
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать