使用 OpenCV 在 Python 中进行 10 位视频处理

问题描述 投票:0回答:1

我需要处理位深度为 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.

提前致谢

python opencv image-processing video-processing
1个回答
0
投票

可能是使用默认构建选项/ffmpeg 的默认 OpenCV 安装不支持此格式/编解码器(例如 HVEC iOS 视频等)。

进行快速搜索后,我发现了这个ffmpeg Chroma Subsampling 设置。 我还没有测试过,但我怀疑应该可以:

  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 位图像,您仍然应该能够保存对通过
Mat
加载的
cv2.imread()
的引用,并带有
cv2.IMREAD_ANYDEPTH
标志)

(出于可视化目的,如果使用深度图,请记住在

Mat
之前对
cv2.imshow
进行归一化或重新缩放,以便以有用的方式进行预览。)

© www.soinside.com 2019 - 2024. All rights reserved.