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