3

我正在寻找一个简单的 c/c++ 库,它允许将视频的第一帧提取为 uchar 数组。并有一个简单的功能来访问下一个。

我知道 FFMPEG,但它需要使用数据包和类似的东西,我很惊讶在网上没有任何地方可以找到一个允许类似的库:

视频 v = openVideo("路径"); uchar* 数据 = v.getFrame(); v.nextFrame();

我只需要提取视频的帧以将其用作纹理...之后无需重新编码或其他任何东西...

当然,可以读取最多格式的东西会很棒,例如基于 libavcodec 构建的东西;p

我正在使用 Windows 7

谢谢!

4

3 回答 3

3

以下是 OpenCV 的示例:

#include <cv.h>
#include <highgui.h>

int
main(int argc, char **argv)
{       
    cv::VideoCapture capture(argv[1]);
    if (capture.grab())
    {   
        cv::Mat_<char> frame;
        capture.retrieve(frame);
        //
        // Convert to your byte array here
        //
    }    
    return 0;
}

它未经测试,但我从一些现有的工作代码中蚕食了它,所以你不应该花很长时间让它工作。

cv::Mat_<unsigned char>本质上是一个字节数组。如果您确实需要明确类型的东西unsigned char *,那么您可以 malloc 适当大小的空间并使用迭代矩阵

您可以cv::Mat使用像素位置(cv::Mat_::at())或迭代器(cv::Mat_::begin()和朋友)将 a 转换为字节数组。

库很少将图像数据公开为简单指针的原因有很多,例如:

  • 这意味着整个图像必须在内存中占据一个连续的空间。这在处理大图像时很重要
  • 它需要提交一定的数据顺序(像素与非平面——RGB 平面是散布存储还是分开存储?)并降低了灵活性
  • 取消引用指针是导致错误(缓冲区溢出等)的原因。

所以如果你想要你的指针,你必须为它做一些工作。

于 2011-02-10T10:20:06.983 回答
1

您可以使用 OpenCV,它非常简单,并且他们的网站http://opencv.willowgarage.com/wiki/上有一本有用的手册

于 2011-02-10T10:02:47.287 回答
0

使用 DirectShow。这是一篇文章: http: //www.codeproject.com/KB/audio-video/framegrabber.aspx DirectShow '附加组件' 来解码不同的视频格式。这是您可以获取免费 DirectShow 过滤器包以解码 DirectShow 不直接支持的一些常见格式的站点之一:http ://www.free-codecs.com/download/DirectShow_FilterPack.htm

于 2010-09-22T15:41:54.113 回答