簡體   English   中英

python 來自一系列圖像的 16 位灰度視頻

[英]python 16bit grayscale video from series of images

我有一個 uint16 類型的灰度圖像數據集,我想將其保存為視頻文件,output 應該是 uint16 類型的無損視頻文件,我試過這個代碼,

video = cv2.VideoWriter(file_name, 0, fps, (w, h), isColor=False)
for frame in frames:
  video.write(frame)
video.release()
cv2.destroyAllWindows()

但是 opencv 只支持 uint8,有誰知道一個好方法嗎?

您可以使用 FFMPEG 來完成。 FFV1編解碼器是無損的,支持gray16le像素格式(16UC1 中的圖像)。 您可以制作.avi 視頻。

ffmpeg -i depth_%06d.tif -c:v ffv1 -vf -crf 0 output_ffv1.avi

但是,您的圖像必須是gray16le格式(將圖像保存為 .tif 即可)。 如果您的圖像是 PNG,它們可能不是gray16le格式,而是灰色格式(如果您想稍后從視頻中獲取圖像,這將不起作用)。 您可以使用 ffprobe 進行檢查。

ffprobe -i depth_image.png

Output 必須有類似的東西:

Stream 0:0: Video: tiff, gray16le, 1280x720, 25 tbr, 25 tbn, 25 tbc

獲得視頻 (.avi) 后,您可以使用 ffprobe 再次檢查像素格式,它也必須是gray16le

Stream 0:0: Video: ffv1 (FFV1 / 0x31564646), gray16le, 1280x720, 45067 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

現在,如果你想從視頻中取回圖像。 您可以使用ffmpeg-python 這將從視頻中提取 unit16 arrays。 然后您可以將此數組保存為 PNG 或 TIFF 或任何您需要的格式。

import ffmpeg
def extract_frame(input_vid, frame_num):
   out, _ = (
       ffmpeg
       .input(input_vid)
       .filter_('select', 'gte(n,{})'.format(frame_num))
       .output('pipe:', format='rawvideo', pix_fmt='gray16le', vframes=1)
       .run(capture_stdout=True, capture_stderr=True)
   )
   return np.frombuffer(out, np.uint16).reshape([720, 1280])
 
for i in range($totalFrameNumber):
   frame = extract_frame('test_ffv1.avi',i)

將 $totalFrameNumber 更改為 your.avi 視頻中的總幀數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM