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

时间:2011-02-16 14:53:07

标签: c++ visual-studio-2010 opencv mjpeg

我需要修改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是正确的方式还是有人知道更轻松的方式?

2 个答案:

答案 0 :(得分: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),不要忘记添加库的路径。

答案 1 :(得分:1)

使用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