使用FreeImage帮助OpenCV读出更多图像(转)
(2014-03-20 09:21:12)
转载▼OpenCV读图像的能力比较弱,尤其是对常见的 Tiff 支持得很差。通过研究 OpenCV 的源代码,发现它针对 Tiff 只能读出以 LZW 和 JPEG 两种压缩格式保存的单页 RGBA 图像,而大量使用的 G4 等二值化图像和多页图像的 Tiff 文件是不能被 OpenCV 直接读出的。这可以使用 libTiff 帮助读入这些 Tiff 文件。不过使用 FreeImage 更好一些。因为在 FreeImage 中已经把 libTiff 封装成一个 filter 了,FreeImage 提供了一个高层的图像访问统一接口,支持了大量的图像编解码 filter,并且能够找到大量基于 FreeImage 的 filter ,所以使用 FreeImage 是一个更好的选择。当读入图像的位深度小于一个字节时,不能直接在 opencv 中创建 iplImage,可以使用 FreeImage 将这类图像转化为灰度图像,然后再输入 opencv 中。另一个需要注意的是 FreeImage 中的图像如果直接输入 IplImage,则出现了水平翻转,因此不能直接使用从 FreeImage 获得的图像作为 IplImage 的数据。以下是一段把 FreeImage 的位图转换成 opencv 图像的示例代码(片段):void zig_image_group::load_bitmap(FIBITMAP* bitmap) { if (!bitmap) return; // 取得位图数据 unsigned int imageWidth = FreeImage_GetWidth(bitmap); unsigned int imageHeight = FreeImage_GetHeight(bitmap); unsigned short channels = 1; unsigned short depth = FreeImage_GetBPP(bitmap); FIBITMAP * bitmap_temp = 0; unsigned char * data = 0; if (depth < 8) { // opencv 只能创建 8 位的图像 depth = 8; if( NULL != (bitmap_temp = FreeImage_ConvertToGreyscale(bitmap)) ) { data = FreeImage_GetBits(bitmap_temp); } } else { assert (depth % 8 == 0); channels = depth / 8; depth = 8; data = FreeImage_GetBits(bitmap); } // 创建 opencv 图像,读入位图信息