Мне нужно обработать видео с разрядностью 10 бит. Я хочу сохранить всю информацию, но OpenCV продолжает конвертировать изображения в 8 бит. Есть ли способ сохранить битовую глубину при обработке изображений?
Мой код выглядит следующим образом:
import cv2
import numpy as np
cv2.namedWindow("ROI", cv2.WINDOW_NORMAL)
video_capture = cv2.VideoCapture("Ciftci.MP4",)
video_capture.set(cv2.CAP_PROP_CONVERT_RGB, 0)
ret, frame0 = video_capture.read()
column, row, height, width = cv2.selectROI('ROI', frame0)
Но я продолжаю получать следующую ошибку:
[ WARN:[email protected]] global cap_ffmpeg_impl.hpp:1592 retrieveFrame Unknown/unsupported picture format: yuv422p10le, will be treated as 8UC1.
заранее спасибо
Возможно, установка OpenCV по умолчанию с параметрами сборки по умолчанию/ffmpeg не поддерживает этот формат/кодек (например, видео HVEC iOS и т. д.).
Выполняя быстрый поиск, я заметил эту настройку ffmpeg Chroma Subsampling. Я еще не проверял это, но подозреваю, что должно быть возможно:
cv2.VideoCapture
будет поддерживать yuv422p10le.Настройка/сборка OpenCV и его многочисленных зависимостей, в зависимости от вашей ОС, может занять некоторое время/усилия, поэтому вот еще одна идея (с двумя вариантами): создайте прототип своей идеи с помощью 10-битных данных, прежде чем тратить время на создание пользовательской сборки OpenCV Python.
Идея состоит в том, чтобы сначала преобразовать ваше видео в последовательность изображений (это может быть 16-битный PNG, вы можете использовать ffmpeg или другие инструменты). Вы можете попробовать загрузить последовательность через cv2.VideoCapture
, также используя флаг cv2.CAP_IMAGES (хотя я не помню, может ли он обрабатывать 16-битные изображения по умолчанию). (Имейте в виду имя отформатированной последовательности изображений (например, img_%03d.png
(что-то вроде img_001.png
...). Если ваша последовательность изображений названа правильно, даже указание имени файла первого кадра может сработать (например, cv2.VideoCapture("frames/img_001.png", cv2.CAP_IMAGES)
).
Если cv2.VideoCapture
не обрабатывает 16-битные изображения, вы все равно сможете сохранить ссылку на Mat
, которую вы загружаете через cv2.imread()
, с флагом cv2.IMREAD_ANYDEPTH)
(В целях визуализации, если вы используете карту глубины, не забудьте нормализовать или изменить масштаб Mat
перед cv2.imshow
для удобного предварительного просмотра.)
Может быть, вы можете поделиться ссылкой на свое видео (Google Диск, Dropbox, GitHub?), чтобы люди могли попытаться его прочитать.