Python与OpenCV中的10位视频处理

1 投票
1 回答
70 浏览
提问于 2025-04-14 17:34

我需要处理一个位深为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的色度子采样设置。我还没测试过,但我猜应该可以:

  1. 获取一个支持这个功能的ffmpeg版本
  2. 用这个版本的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进行归一化或重新缩放,以便以有用的方式预览。)

撰写回答