【发布时间】:2017-02-07 08:10:41
【问题描述】:
当我将 Freeimage FIBITMAP* fromat 中的 gif 彩色图像转换为 OpenCV Mat 时,颜色丢失了。我使用opencv 3.1.0。
-
我用这段代码阅读了 A1.gif:
FREE_IMAGE_FORMAT format = FreeImage_GetFileType(imgPath.c_str(), 0); FIBITMAP *image = FreeImage_Load(format, imgPath.c_str());
-
如果我使用此代码将图像转换为 OpenCV Mat 并显示它,我会看到 A2.jpg。 为什么 OpenCV 显示此图像而不是 A1.gif?
Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_8UC3, FreeImage_GetBits(image), FreeImage_GetPitch(image)); namedWindow("Display window", WINDOW_AUTOSIZE); imshow("Display window", img);
- 如果我将 CV_8UC3 更改为 CV_8UC1,我会看到 A3.jpg。
对于 jpg 或 tif 等其他格式不存在问题。解决办法是什么?
另一个例子是 B1.gif、第二阶段的分段错误和 B3.jpg。
B1.gif(好像我上传这张照片的时候alpha通道被去掉了。)
我看到了这两个帖子,但他们有同样的问题。
Convert FreeImage FIBITMAP format to OpenCV Mat
c++ - FreeImage+OpenCV - 16bit image get distorted
更新:我找到了解决方案。
使用 FreeImage 加载 gif 并将其转换为 OpenCV Mat 的正确代码:
FIBITMAP *image = FreeImage_Load(format, GifImagePath);
RGBQUAD *pal = FreeImage_GetPalette(image);
unsigned width = FreeImage_GetWidth(image);
unsigned height = FreeImage_GetHeight(image);
FIBITMAP *tmp = FreeImage_Allocate(width, height, 24);
BYTE *tmp_bits = FreeImage_GetBits(tmp);
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
BYTE t;
//FreeImage_GetPixelIndex(image,x, y, &t);//safer, in animated gif
t = img_bits[x+y*height];//Probably faster
RGBQUAD color = pal[t];
//FreeImage_SetPixelColor(tmp, x, y, &color);//safer, in animated
//Probably faster
tmp_bits[(x+y*height)*3 +FI_RGBA_RED] = color.rgbRed;
tmp_bits[(x+y*height)*3+FI_RGBA_GREEN] = color.rgbGreen;
tmp_bits[(x+y*height)*3+FI_RGBA_BLUE] = color.rgbBlue;
}
}
Mat img(FreeImage_GetHeight(tmp), FreeImage_GetWidth(tmp), CV_8UC3, FreeImage_GetBits(tmp), FreeImage_GetPitch(tmp));
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", img);
【问题讨论】:
-
@MarkSetchell 是的。你的答案是正确的,但我一开始无法用 FreeImage 实现它,现在我设法做到了。
标签: opencv opencv3.0 freeimage