从 MJPEG 文件中提取静止图像?

Posted

技术标签:

【中文标题】从 MJPEG 文件中提取静止图像?【英文标题】:Extract still image from MJPEG file? 【发布时间】:2011-02-16 14:53:06 【问题描述】:

我需要修改 mjpeg 文件的每个 jpg 图像。

我必须使用 Visual Studio C++ 2010。

到目前为止,我需要 a) 从源加载 mjpeg 文件 b) 提取位图(CImage、字节数组、...)

在伪代码中应该是这样的:

fun getBitmap(filename, timestamp)

  MJPEG myInput = Open(filename);
  BITMAP myOutput = myInput.getBitmap(timestamp);
  return myOutput;

有什么办法可以解决这个问题? 我已经尝试过使用 OpenCV2.1.0,但总是出现 LNK2001 错误。 (Tutorial来自官网)。

OpenCV 是正确的方法还是有人知道更简单的方法?

【问题讨论】:

【参考方案1】:

您想使用视频中的 JPEG 图像还是解压缩它们?

一个 MJPEG 流由许多 JPEG 图像组成,没有通常的 JPEG 标头(和代码字典)。因此,如果您想无损提取它们并在一个目录中获取大量 JPEG 文件,其他工具可能更适合您。

但是,如果您仍要修改它们,则需要将它们解压缩。只要您有必要的后端来解码流,OpenCV 就是一种很好的方法(一些适用于 Windows 的编解码器......在 Linux 上,ffmpeg 库将为您解码几乎所有内容)。

所以我会这样做:

CvCapture *capture = cvCaptureFromFile("filename.avi");
IplImage *current_frame = NULL;
while(current_frame = cvQueryFrame(capture)) 
  process(current_frame); // that's your modification code

看这个:

http://opencv.willowgarage.com/documentation/c/highgui_reading_and_writing_images_and_video.html

对于链接器错误:LNK2001 是“未解析的外部符号”,所以...您添加了库吗? (附加依赖项,添加所有四个库(cv210.lib cxcore210.lib、cvaux210.lib 和 highgui210.lib,或者...检查您的 OpenCV 安装以获取正确的名称)。确保您的项目编译为 32 位(或相同)作为 OpenCV),不要忘记添加库的路径。

【讨论】:

MPEG 解码器是默认解码器之一 - openCV 现在也可以在 Windows 上使用 ffmpeg 构建【参考方案2】:

使用 gstreamer 工具

对于基于 ip 的源

gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec !  videoflip method=vertical-flip ! jpegenc !  multifilesink location=image-out-%05d.jpg

用于带有 mjpeg 编解码器和 avi 容器的文件源

gst-launch filesrc location="xyz.avi" ! multipartdemux ! jpegdec !  videoflip method=vertical-flip ! jpegenc !  multifilesink location=image-out-%05d.jpg

【讨论】:

以上是关于从 MJPEG 文件中提取静止图像?的主要内容,如果未能解决你的问题,请参考以下文章

从坐标列表中提取运动数据

PHP从文件夹中提取随机图像

从OGG文件中提取封面图像

Ruby:从 docx 文件中解析/提取图像和对象

从图像文件中提取感兴趣区域而不读取整个图像

如何从图像中提取 (x, y) 坐标并写入 CSV 文件?