OpenCV支持的文件扩展名列表

6
在OpenCV中,我看到imread()和VideoCapture()都需要一个文件路径字符串来读取多种扩展名的文件。有没有办法获取它们支持的扩展名列表?例如获取"jpg"、"png"、"mov"、"mpg"等列表。我想这与系统相关,其他人也需要在运行时查询。
此外,支持是如何确定的呢?如果我有像下面的代码,并且得到的Mat始终似乎部分损坏(我可以看到一点图像),这该怎么办?无论我要求哪个帧数,它似乎都不会改变。我可以在我的视频播放器"totem"中播放这个视频,但我甚至不确定totem和OpenCV是否使用同一种编解码器来解码这个文件。
Mat fromVideo(std::string _videoPath, int frame) {
    VideoCapture capture(_videoPath);

    Mat f;
    for (int i = 0; i < frame; i++) {
        capture >> f;
    }
    return f;
}

似乎这个问题在任何地方都没有得到答案。 - Z.Wei
3个回答

5
对于imread()(更多信息请参见此处):
  • Windows位图 - *.bmp,*.dib(始终支持)
  • JPEG文件 - *.jpeg,*.jpg,*.jpe(请参见注意事项部分)
  • JPEG 2000文件 - *.jp2(请参见注意事项部分)
  • 可移植网络图形 - *.png(请参见注意事项部分)
  • 可移植图像格式 - *.pbm,*.pgm,*.ppm(始终支持)
  • Sun光栅 - * .sr,* .ras(始终支持)
  • TIFF文件 - * .tiff,* .tif(请参见注意事项部分)
对于VideoCapture()
  • AVI文件 - *.avi

    看起来AVI是唯一在各平台上支持良好的格式。更多信息请参考此处


1
关于 AVI 是唯一支持的容器格式的有用信息。我想补充一点,不是所有的编解码器都提供准确的帧定位功能。例如,在我的 Windows 7 机器上,Lagarith 不允许准确的定位,但 Ut 编解码器YUV420 格式下工作得很好。我没有尝试过 HuffYUV 或 MS 无损 i420/yuv。 - chappjc

2
使用方法cv::VideoCapture::isOpened()来确保构造函数成功初始化了VideoCapture对象。
请注意,即使可以从OpenCV(例如AVI、MKV等)获取支持的容器格式列表及其典型的文件名扩展名,您仍然需要知道支持的编解码器的精确列表(即就算您知道精确的文件名,该文件也可能损坏等问题)。因此,仅凭文件名扩展名列表无法准确描述OpenCV内部支持的内容,而在OpenCV API级别上最简单的解决方案是使用isOpened()方法。

0

更新:

cv::VideoCapture cap("D:\\test.mp4")

对我来说可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接