2013-05-27 71 views
1

我實際上試圖使用giflib使用以下代碼從gifFile提取圖像。使用giflib提取幀segfault C++

t_gif initGif(const char *filename){ 
    t_gif gif; 
    int *error; 
    GifFileType *GifFile = DGifOpenFileName(filename, error); 
    assert(error != NULL); 

    int ret = DGifSlurp(GifFile); 
    assert(ret == GIF_OK); 

    gif.h = (int)GifFile->SHeight; 
    gif.w = GifFile->SWidth; 
    gif.nbFrames = GifFile->ImageCount; 
    gif.colorSize = GifFile->SColorResolution; 

    GifImageDesc Image = GifFile->Image; 
    SavedImage *img = &GifFile->SavedImages[0]; 

    cout << "width: " << gif.w << endl; 
    cout << "height: " << gif.h << endl; 
    cout << "Image Count: " << gif.nbFrames << endl; 
    cout << "SColor Resolution: " << gif.colorSize << endl; 
    Mat color = Mat(Size(gif.w, gif.h), CV_8UC1, img->RasterBits); 
    imwrite("./test.png", color); 
    return gif; 
} 

但是這會導致段錯誤。我在v2.4.5中使用opencv,在v5.0.4中使用giflib。 我認爲這不是由Opencv引起的,因爲在v4中使用giflib我在這裏沒有問題。

更多下面的測試也會導致段錯誤。

printf("%u\n", (unsigned int)img->RasterBits[0]); 

GDB輸出:

(gdb) run bsd.gif 
Starting program: /home/matt/Code/perso/utils/gif/a.out bsd.gif 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
Gif Analyser tool 
started by MG in may 2013 
compiled with giflib: v5.0.4 
width: 1000 
height: 907 
Image Count: 0 
SColor Resolution: 8 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000401af3 in initGif (filename=0x7fffffffe2be "bsd.gif") at main.cpp:40 
40  Mat color = Mat(Size(gif.w, gif.h), CV_8UC1, img->RasterBits); 
(gdb) 

我還沒有找到如何讓顏色改回使用colorGlobal表。

有人可以幫我嗎? 謝謝

+0

什麼是'colorSize'屬性?如果它是用於存儲像素顏色的類型的大小,它似乎使用「double」(8字節)而不是「unsigned int」。 – Turgal

+0

看着giflib的來源,這是一個int。 http://sourceforge.net/p/giflib/code/ci/master/tree/lib/gif_lib.h#l33 – Poko

+0

接下來的三位是顏色分辨率。它們只有在有全局顏色表時纔有意義,並允許您計算其大小。如果此字段的值爲N,則全局顏色表中的條目數將爲2 ^(N + 1) - 也就是說,兩個上升到功率(N + 1)。因此,樣本圖像中的001代表2位/像素; 111將代表8位/像素。 (http://giflib.sourceforge.net/whatsinagif/bits_and_bytes.html) – Poko

回答

0

我剛回到版本4.1.6,一切都很好。 v5可能被竊聽。

0

要獲取顏色信息,可以使用圖像的光柵位作爲顏色映射的索引,從而獲取相應像素的RGB信息。然後,可以簡單地使用CV_8UC3數據類型將gif幀存儲爲彩色PNG 。