Весь кадр поворачивается после захвата видео - PullRequest
1 голос
/ 14 января 2020

кадровые переменные пиксель - весь кадр

окружение

  • python версия
3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
  • версия opencv
opencv-contrib-python==4.1.2.30
opencv-python==4.1.2.30

Moviefile 30 секунд

высота кадра = 1920, ширина = 1080

cap = cv2.VideoCapture(video_file_path)
frames = []
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        frames.append(frame)
    else:
        break
plt.imshow(frames[0])

При выполнении высота = 1080, ширина = 1920

Как сделать Я? Спасибо

1 Ответ

1 голос
/ 14 января 2020

Ваше видео вращается с настройками метаданных и не кодируется в формате 1080x1920.

Наиболее вероятное объяснение состоит в том, что разрешение видео составляет 1920x1080 (ширина = 1920 и высота = 1080) [это стандартное разрешение видео FullHD].
Также возможно, что видео снято с камерой, повернутой на 90 градусов.

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

Вот пример поворота mp4 путем установки метаданных с использованием FFmpeg : Поворот mp4-видео без перекодирования .

Когда OpenCV читает видеокадр, он читает его в исходной ориентации (1920x1080, а не 1080x1920).

Это общее соглашение, касающееся большинства метаданных видео. OpenCV предполагает, что вы знаете, что флаг метаданных установлен на «повернутый», и предполагает, что вы отвечаете за поворот кадра перед его отображением (ваш * Программа 1061 * предполагает выполнение работы игроков).

Вот пример создания примера файла видео mp4 с использованием FFmpeg (в командной строке):

ffmpeg -y -r 10 -f lavfi -i testsrc=rate=10:size=198x108 -t 5 -c:v libx264 vid0.mp4

Вот пример поворота видео с помощью установки метаданных:

ffmpeg -i vid0.mp4 -c copy -metadata:s:v:0 rotate=90 vid90.mp4

В следующем коде Python форма обоих видео одинакова: (108, 198, 3) (ширина = 198, высота = 108):

import cv2
from matplotlib import pyplot as plt

# video_file_path = 'vid0.mp4'

video_file_path = 'vid90.mp4'

cap = cv2.VideoCapture(video_file_path)
frames = []
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        frames.append(frame)
    else:
        break

plt.imshow(frames[0])

Вы можете проверить видео метаданные с помощью инструмента mediainfo :

enter image description here

Читать метаданные в Python сложнее, чем я думал (я никогда не пробовал ).
Вы можете найти решение здесь .
[Теперь я понял, что ваш вопрос, вероятно, дублируется].

Первый кадр видео vid90 в MP C -H C Плеер:
enter image description here

Первый кадр видео vid90 в Python (matplotlib):
enter image description here

...