OpenCV输出单色TIFF group 4压缩
OpenCV output monochrome TIFF group 4 compression
有没有办法在 OpenCV 中使用第 4 组压缩输出单色 TIFF 文件?
这是用 imagemagick/graphicsmagick
执行的命令
'gm convert '.$file.' -type bilevel -monochrome -compress group4 '.$output
OpenCV 版本4.5.1
更新
# g++ -Wall -O3 -std=c++17 main.cpp -o main `pkg-config opencv4 --cflags --libs` -ltiff
find
没有 return 任何东西
root@x:/usr/include/opencv4/opencv2# find . -name "*tif*"
代码
#include <tiffio.h>
#include <opencv4/opencv2/opencv.hpp>
std::vector<int> params = {cv::IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4};
cv::imwrite(_output, src_bin, params);
错误
[ WARN:0] global ../modules/imgcodecs/src/grfmt_tiff.cpp (914)
writeLibTiff OpenCV TIFF(line 914): failed TIFFSetField(tif,
TIFFTAG_PREDICTOR, predictor) imwrite_('out.tif'): can't write data:
OpenCV(4.5.1) ../modules/imgcodecs/src/grfmt_tiff.cpp:914: error:
(-2:Unspecified error) OpenCV TIFF: failed TIFFSetField(tif,
TIFFTAG_PREDICTOR, predictor) in function 'writeLibTiff'
OpenCV 使用 libtiff
(link). If you call cv.imwrite
(link) 你可以传递额外的参数。
对于第 4 组压缩,文档说您必须传递 IMWRITE_TIFF_COMPRESSION
标志 (link) with value COMPRESSION_CCITTFAX4
(link)。
示例:
#include <tiffio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
vector<int> params = {IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4};
bool success = imwrite("image.tif", img, params);
更新
好吧,它应该是这样工作的。但是目前opencv4在编写Group 4 TIFF上似乎存在一个或多个问题。顺便说一句,当你尝试 python-lib 时也是一样的。 This known issue 处理 opencv 错误添加的预测器标签。我将此修复程序应用于我的本地构建,但之后又出现了一个问题,缺少将组 4 的 8 位 Mat 转换为 1 位/样本。所以我的建议是:
解决方法
您可以使用 GraphicsMagick API Magick++.
#include <opencv2/opencv.hpp>
#include <Magick++.h>
using namespace cv;
using namespace Magick;
int main(int argc, char* argv[]) {
InitializeMagick("");
Mat img = imread("img.png");
Image image(img.cols, img.rows, "BGR", CharPixel, (char *)img.data);
image.compressType(CompressionType::Group4Compression);
image.write("img.tif");
return(0);
}
有没有办法在 OpenCV 中使用第 4 组压缩输出单色 TIFF 文件?
这是用 imagemagick/graphicsmagick
执行的命令'gm convert '.$file.' -type bilevel -monochrome -compress group4 '.$output
OpenCV 版本4.5.1
更新
# g++ -Wall -O3 -std=c++17 main.cpp -o main `pkg-config opencv4 --cflags --libs` -ltiff
find
没有 return 任何东西
root@x:/usr/include/opencv4/opencv2# find . -name "*tif*"
代码
#include <tiffio.h>
#include <opencv4/opencv2/opencv.hpp>
std::vector<int> params = {cv::IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4};
cv::imwrite(_output, src_bin, params);
错误
[ WARN:0] global ../modules/imgcodecs/src/grfmt_tiff.cpp (914) writeLibTiff OpenCV TIFF(line 914): failed TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor) imwrite_('out.tif'): can't write data: OpenCV(4.5.1) ../modules/imgcodecs/src/grfmt_tiff.cpp:914: error: (-2:Unspecified error) OpenCV TIFF: failed TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor) in function 'writeLibTiff'
OpenCV 使用 libtiff
(link). If you call cv.imwrite
(link) 你可以传递额外的参数。
对于第 4 组压缩,文档说您必须传递 IMWRITE_TIFF_COMPRESSION
标志 (link) with value COMPRESSION_CCITTFAX4
(link)。
示例:
#include <tiffio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
vector<int> params = {IMWRITE_TIFF_COMPRESSION, COMPRESSION_CCITTFAX4};
bool success = imwrite("image.tif", img, params);
更新
好吧,它应该是这样工作的。但是目前opencv4在编写Group 4 TIFF上似乎存在一个或多个问题。顺便说一句,当你尝试 python-lib 时也是一样的。 This known issue 处理 opencv 错误添加的预测器标签。我将此修复程序应用于我的本地构建,但之后又出现了一个问题,缺少将组 4 的 8 位 Mat 转换为 1 位/样本。所以我的建议是:
解决方法
您可以使用 GraphicsMagick API Magick++.
#include <opencv2/opencv.hpp>
#include <Magick++.h>
using namespace cv;
using namespace Magick;
int main(int argc, char* argv[]) {
InitializeMagick("");
Mat img = imread("img.png");
Image image(img.cols, img.rows, "BGR", CharPixel, (char *)img.data);
image.compressType(CompressionType::Group4Compression);
image.write("img.tif");
return(0);
}