OpenCV 4.10中TIFF LZMA压缩失效问题求助
针对你遇到的OpenCV 4.10保存32位浮点TIFF时LZMA压缩失效的问题,结合你提供的对比代码(直接调用libtiff可正常压缩),可能的原因及验证方向如下:
1. 压缩枚举值的匹配问题
OpenCV中cv::IMWRITE_TIFF_COMPRESSION_LZMA的定义可能与libtiff原生的COMPRESSION_LZMA数值不匹配。libtiff中LZMA压缩的标识是0x886D,你可以尝试直接用数值代替枚举值测试:
std::vector<int> compression_params = { cv::IMWRITE_TIFF_COMPRESSION, 0x886D // 直接使用libtiff的LZMA压缩码 };
2. 浮点TIFF的压缩支持限制
OpenCV的TIFF写入逻辑可能对**浮点格式(SAMPLEFORMAT_IEEEFP)**存在特殊处理,默认跳过了压缩参数的传递。你可以先测试保存整数类型图像(比如cv::Mat1u或cv::Mat1s),用同样的压缩参数,看是否能正常启用LZMA压缩:
cv::Mat1u test_image(76, 228, 127); // 生成8位整数测试图 std::vector<int> compression_params = { cv::IMWRITE_TIFF_COMPRESSION, cv::IMWRITE_TIFF_COMPRESSION_LZMA }; cv::imwrite("test_compress.tif", test_image, compression_params);
如果整数图像能正常压缩,说明问题出在OpenCV对浮点TIFF的压缩支持逻辑上。
3. OpenCV编译时的libtiff配置问题
若OpenCV编译时链接的libtiff版本未启用LZMA支持,或者编译选项中未正确开启相关功能,即使代码中指定了压缩参数也无法生效。你可以通过以下代码输出OpenCV的编译配置,检查LIBTIFF相关信息:
std::cout << cv::getBuildInformation() << std::endl;
查看输出中是否存在LIBTIFF: YES (ver x.x.x, with LZMA)之类的描述,确认libtiff是否带LZMA支持编译。
4. OpenCV内部参数覆盖
检查OpenCV的TIFF写入源码(modules/imgcodecs/src/grfmt_tiff.cpp),在处理浮点图像时是否存在强制设置压缩为COMPRESSION_NONE的逻辑。部分版本中,OpenCV可能为了兼容性,对非整数格式的TIFF默认禁用压缩。
内容的提问来源于stack exchange,提问作者Wang

