如何使用giflib从gif中提取图像到cv :: Mat in C ++

时间:2013-05-16 08:02:14

标签: c++ opencv gif

我正在尝试使用giflib从gif中提取图像,以便在Opencv Mat中绑定它们。 我目前正在使用Opencv-2.4.5和giflib-4.1.6-10。

我的问题是我只能提取第一张gif图像。 第二个和其他的都是划伤的,我认为这是一个有点小的问题。

关注文档:http://giflib.sourceforge.net/gif_lib.html

SavedImage *SavedImages; /* Image sequence (high-level API) */

应提供指向图像位的指针。

#include <gif_lib.h>
#include <iostream>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;


int main(int ac, char **av){
    int *err;
    GifFileType *f = DGifOpenFileName(av[1]);
    assert(f != NULL);
    int ret = DGifSlurp(f);
    assert(ret == GIF_OK);
    int width = f->SWidth;
    int height = f->SHeight;
    cout << f->ImageCount << endl;
    cout << width << " : " <<  height<< endl;
    cout << f->SColorResolution << endl;

    // SavedImage *image = &f->SavedImages[0]; Does actually works
    SavedImage *image = &f->SavedImages[1]; // that compile but the result is a scratched img


    Mat  img = Mat(Size(width, height), CV_8UC1, image->RasterBits);
    imwrite("test.png", img);

    DGifCloseFile(f);
    return 0;
}

我不想使用ImageMagick保留一小段代码并保持“轻”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您是否检查过您的GIF文件是否是隔行扫描的?如果是,则应在将rasterbits存储为位图格式之前考虑它。 还要检查&#34; SavedImages&#34;的顶部,左侧,宽度和高度。 ,每一帧都不需要覆盖所有画布,因此您应该只覆盖与最后一帧不同的像素。