将视频分解为图像进行处理
Break video into images for processing
我最近找到了 friday,一个用于 haskell 的图像处理库,到目前为止它看起来还不错,但我希望能够加载视频并将它们分解成图像。 haskell有这样的图书馆吗?
我不知道这样的库是否存在,但我怀疑不存在。视频编解码器非常复杂。如果 haskell 的东西存在,它很可能是 ffmpeg
包装器。无论如何,如果您只需要从某些视频中提取帧,我会直接使用 ffmpeg
命令行工具。或者使用系统调用来动态完成。
ffmpeg 命令对于这个任务来说非常简单:
ffmpeg -i "input.mov" -an -f image2 "output_%05d.jpg"
https://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/image_sequence
请注意,有一些巧妙的 ffmpeg bindings that stream images from a video in the JuicyPixel image types. There is already a ticket 可以让 friday
和 JuicyPixels
玩得很好 - 如果您真的有兴趣以干净的方式完成这项工作,我强烈建议您制作一个补丁到周五解决这张票。
此外,由于周五的维护者一直忙到 9 月,我很乐意在 my own repository 上将您的一些更改与我的更改合并以供一般使用。
编辑:这很有趣。获取惰性图像列表的一种方法是 unsafeInterleaveIO
:
module LazyDemo where
import Vision.Image.JuicyPixels
import Vision.Image (RGBA)
import Codec.FFmpeg
import System.IO.Unsafe
lazyStream :: FilePath -> IO [RGBA]
lazyStream fp = do
initFFmpeg
(rd,close) <- imageReader fp
go rd close
where
go rd close = do
mi <- rd
case mi of
Nothing -> close >> return []
Just i -> (toFridayRGBA i : ) <$> unsafeInterleaveIO (go rd close)
我最近找到了 friday,一个用于 haskell 的图像处理库,到目前为止它看起来还不错,但我希望能够加载视频并将它们分解成图像。 haskell有这样的图书馆吗?
我不知道这样的库是否存在,但我怀疑不存在。视频编解码器非常复杂。如果 haskell 的东西存在,它很可能是 ffmpeg
包装器。无论如何,如果您只需要从某些视频中提取帧,我会直接使用 ffmpeg
命令行工具。或者使用系统调用来动态完成。
ffmpeg 命令对于这个任务来说非常简单:
ffmpeg -i "input.mov" -an -f image2 "output_%05d.jpg"
https://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/image_sequence
请注意,有一些巧妙的 ffmpeg bindings that stream images from a video in the JuicyPixel image types. There is already a ticket 可以让 friday
和 JuicyPixels
玩得很好 - 如果您真的有兴趣以干净的方式完成这项工作,我强烈建议您制作一个补丁到周五解决这张票。
此外,由于周五的维护者一直忙到 9 月,我很乐意在 my own repository 上将您的一些更改与我的更改合并以供一般使用。
编辑:这很有趣。获取惰性图像列表的一种方法是 unsafeInterleaveIO
:
module LazyDemo where
import Vision.Image.JuicyPixels
import Vision.Image (RGBA)
import Codec.FFmpeg
import System.IO.Unsafe
lazyStream :: FilePath -> IO [RGBA]
lazyStream fp = do
initFFmpeg
(rd,close) <- imageReader fp
go rd close
where
go rd close = do
mi <- rd
case mi of
Nothing -> close >> return []
Just i -> (toFridayRGBA i : ) <$> unsafeInterleaveIO (go rd close)