我需要处理位深度为 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.
提前致谢
可能是使用默认构建选项/ffmpeg 的默认 OpenCV 安装不支持此格式/编解码器(例如 HVEC iOS 视频等)。
进行快速搜索后,我发现了这个ffmpeg Chroma Subsampling 设置。 我还没有测试过,但我怀疑应该可以:
cv2.VideoCapture
将获得 yuv422p10le 支持。设置/构建 OpenCV 及其许多依赖项,具体取决于您的操作系统,可能需要一些时间/精力,因此这里有另一个想法(有两个变体):在将时间投入到自定义 OpenCV Python 构建之前,使用 10 位数据对您的想法进行原型设计。
这个想法是首先将您的视频转换为图像序列(可能是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
进行归一化或重新缩放,以便以有用的方式进行预览。)