【问题标题】:Memory function of the boost::gil libraryboost::gil 库的记忆功能
【发布时间】:2020-04-22 08:23:38
【问题描述】:

我目前正在尝试使用Boost::GIL(具有挑战性)进行一些 TensorFlow 推理(C 后端)。我需要一些想法,我已经能够加载我的 png 图像 (rgb8_image_t) 并转换为rgb32_f_image_t

我还需要 3 次思考,数据的原始指针、分配的内存和维度。

  • 不幸的是,对于分配的内存,函数total_allocated_size_in_bytes() 是私有的,所以我这样做了:

    boost::gil::view(dest).size() * boost::gil::view(dest).num_channels() * sizeof(value_type);

如果我没有任何额外的对齐故事填充,这是有效的。但它是否存在任何不错的选择?

  • 对于维度,我应该匹配numpy(来自 PILLOW),我希望两个库都使用相同的内存布局模式。据我了解,默认情况下,数据是交错连续的,所以应该是好的。

  • 最后一个原始指针_memory,它是Image 类的私有数据成员,没有专用函数。 boost::gil::view(dest).row_begin(0) 在第一个像素上返回一个迭代器,但我不确定如何获取数据 _memory 的指针。有什么建议吗?

非常感谢,

++t

ps:TensorFlow 提出了一个 C++ 后端,但是它不是从任何包管理器安装的,并且操作 Bazel 超出了我的能力。

【问题讨论】:

  • 您考虑对齐是对的,代码库中有一些关于对齐的 cmets 提醒您,您需要确保不要使用破坏内存布局的标志进行编译:@987654321 @

标签: image boost


【解决方案1】:

GIL 文档非常准确地记录了各种内存布局。

不过,库的重点是抽象出内存布局。如果您需要某种表示(平面/交错、打包或解包),那么您正在为库接口做“艰难的方式”。

所以,我认为您可以一口气阅读和转换,例如对于JPEG:

gil::rgb32f_image_t img;
gil::image_read_settings<gil::jpeg_tag> settings;
read_and_convert_image("input.jpg", img, settings);

现在可以获取原始数据了:

auto* raw_data = gil::interleaved_view_get_raw_data(view(img));

恰好是首选实现存储是交错的,这很可能是您所期望的。如果您的特定图像存储是平面的,则该调用将无法编译(您可能需要planar_view_get_raw_data(vw, plane_index))。

请注意,如果需要,您必须将其重新解释为float [const]*,因为没有公共接口来获取对scoped_channel_value&lt;&gt;::value_ 的引用,但BaseChannelValue 类型确实是float,您可以断言包装器不会增加额外的重量:

static_assert(sizeof(float) == sizeof(raw_data[0]));

替代方法:

相反,您可以设置自己的原始像素缓冲区,将可变视图装入其中并使用它来读取/转换您的初始加载:

// get dimension
gil::image_read_settings<gil::jpeg_tag> settings;
auto info = gil::read_image_info("input.jpg", settings).get_info();

// setup raw pixel buffer & view
using pixel = gil::rgb32f_pixel_t;
auto data = std::make_unique<pixel[]>(info._width * info._height);
auto vw = gil::interleaved_view(info._width, info._height, data.get(),
                                info._width * sizeof(pixel));

// load into buffer
read_and_convert_view("input.jpg", vw, settings);

我实际上已经通过写出结果视图来检查它是否正常工作:

//// just for test - doesn't work for 32f, so choose another pixel format
//gil::write_view("output.png", vw, gil::png_tag());

【讨论】:

  • 你在做我的一天!我现在要和TF打架了,谢谢
  • 干杯。我刚刚意识到我在第二个示例中省略了pixel 类型定义,所以我added it
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
相关资源
最近更新 更多