在磁盘上存储OpenCV布尔矩阵

时间:2014-08-27 10:37:09

标签: c++ opencv matrix

我有一个1024x1024的浮点矩阵,我想在文件中保留这个矩阵的符号。为此,我想将符号矩阵保持为Matrix of boolean,但我没有这样做。

假设,我的矩阵是:

2.312, 0.232, -2,132
5.754,  -4,34, -3.23
-4.34,  -1.23, 7.9453 

我的输出应该是

 1,1,0
 1,0,0
 0,0,1

因为float是4Byte而我的矩阵大小是10^20(1M),大小是4MB,布尔值是1位,矩阵大小是1M,我希望bool mat大约是1Mb=128KB但是,当我使用{ threshold我的输出文件中的{1}}方法是opencv,这意味着文件保存为uchar(8位)。

我尝试使用imwrite,但它没有用。

编辑:我意识到我没有提到速度也是我测试的另一个重要因素。我从磁盘上加载了大约1000万个1K * 1K矩阵。

提前致谢

1 个答案:

答案 0 :(得分:1)

在OpenCV中你可以写

Mat input;
Mat A = (input >= 0);

现在的问题是OpenCV没有位图数据类型。所以你能得到的最好的是Mat1u(unsigned char)。

如果您想节省存储空间,则需要自行完成。例如,您可以使用libpng写出位深度为1的PNG文件。不幸的是,imwrite不支持设置该位深度(它可以写入位深度为8和16的PNG)。 / p>

如果你想用bitdepth 8编写一个压缩的PNG,你可以使用imwrite

std::vector<int> flags;
flags.push_back(CV_IMWRITE_PNG_COMPRESSION);
flags.push_back(9);  // [0-9] 9 being max compression, default is 3
cv::imwrite("output.png", A, flags);

这将带来最佳压缩效果。现在,您可以使用Imagemagick将文件大小与存储在位深度1的相同图像进行比较:

convert output.png -type Bilevel -define "png:bit-depth=1" -define "png:compression-level=9" output-1b.png

我使用随机示例图像进行了测试(见下文)。

  • 8位,压缩PNG:24,732字节
  • 1位,压缩PNG:20,529字节
  • 8位,未压缩的PGM:270,015字节
  • 1位,未压缩的PBM:34,211字节

正如您所看到的,在此示例中,压缩的8位存储仍然胜过未压缩的1位存储。

Example bitmap