从 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 文件中提取静止图像?的主要内容,如果未能解决你的问题,请参考以下文章