Python与OpenCV中的10位视频处理
我需要处理一个位深为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:0@4005.073] global cap_ffmpeg_impl.hpp:1592 retrieveFrame Unknown/unsupported picture format: yuv422p10le, will be treated as 8UC1.
提前谢谢你!
1 个回答
2
可能是因为默认安装的OpenCV和它的默认设置/ffmpeg不支持这种格式或编码(比如iOS的HVEC视频等)。
我快速搜索了一下,发现了这个ffmpeg的色度子采样设置。我还没测试过,但我猜应该可以:
- 获取一个支持这个功能的ffmpeg版本
- 用这个版本的ffmpeg和Python绑定从源代码构建OpenCV,这样希望
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位图像,你仍然可以通过cv2.imread()
加载一个Mat
并保持引用,使用cv2.IMREAD_ANYDEPTH
标志)
(为了可视化,如果使用深度图,记得在cv2.imshow
之前对Mat
进行归一化或重新缩放,以便以有用的方式预览。)