gpt4 book ai didi

c++ - 将 Halide 与表示为 float 组的 HDR 图像一起使用

转载 作者:行者123 更新时间:2023-11-28 05:42:41 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章,如果我做错了什么,我深表歉意:)。我会努力做到最好。

我目前正在研究我的 HDR 图像处理程序,我不会使用 Halide 实现一些基础 TMO。问题是我所有的图像都表示为 float 组(顺序如下:b1,g1,r1,a1,b2,g2,r2,a2, ...)。使用 Halide 处理图像需要 Halide::Image 类。问题是我不知道如何将这些数据传递到那里。

任何人都可以提供帮助,或者有同样的问题并且知道答案吗?

编辑:

终于明白了!我需要在生成器中设置输入和输出缓冲区的步幅。感谢大家的帮助:-)

编辑:

我尝试了两种不同的方式:

int halideOperations( float data[] , int size, int width,int heighy ) 
{
buffer_t input_buf = { 0 };
input_buf.host = &data[0];
}

或者:

int halideOperations( float data[] , int size, int width,int heighy ) 
{
Halide::Image(Halide::Type::Float, x, y, 0, 0, data);
}

我正在考虑编辑 Halide.h 文件并将 uint8_t * host 更改为 float_t * host,但我认为这不是个好主意。

编辑:

我尝试将下面的代码与我的 float 图像 (RGBA) 结合使用:

AOT函数生成:

int main(int arg, char ** argv)
{
Halide::ImageParam img(Halide::type_of<float>(), 3);
Halide::Func f;
Halide::Var x, y, c;
f(x, y, c) = Halide::pow(img(x,y,c), 2.f);

std::vector<Halide::Argument> arguments = { img };
f.compile_to_file("function", arguments);
return 0;
}

正确的代码调用:

int halideOperations(float data[], int size, int width, int height)
{
buffer_t output_buf = { 0 };
buffer_t buf = { 0 };
buf.host = (uint8_t *)data;
float * output = new float[width * height * 4];
output_buf.host = (uint8_t*)(output);
output_buf.extent[0] = buf.extent[0] = width;
output_buf.extent[1] = buf.extent[1] = height;
output_buf.extent[2] = buf.extent[2] = 4;
output_buf.stride[0] = buf.stride[0] = 4;
output_buf.stride[1] = buf.stride[1] = width * 4;
output_buf.elem_size = buf.elem_size = sizeof(float);

function(&buf, &output_buf);

delete output;
return 1;
}

不幸的是,我遇到了 msg:

 Error: Constraint violated: f0.stride.0 (4) == 1 (1)

我认为这一行有问题:output_buf.stride[0] = buf.stride[0] = 4,但我不确定应该更改什么。有什么建议吗?

最佳答案

如果直接使用 buffer_t,则必须将分配给 host 的指针转换为 uint8_t * :

buf.host = (uint8_t *)&data[0]; // Often, can be just "(uint8_t *)data"

如果您正在使用提前 (AOT) 编译并且数据未作为直接调用 Halide 的代码的一部分进行分配,这就是您想要执行的操作。 (下面讨论的其他方法控制存储分配,因此它们不能接受传递给它们的指针。)

如果您使用的是 Halide::Image 或 Halide::Tools::Image,则类型转换将在内部处理。上面用于 Halide::Image 的构造函数不存在,因为 Halide::Image 是一个模板类,其中基础数据类型是模板参数:

Halide::Image<float> image_storage(width, height, channels);

请注意,这将以平面布局存储数据。 Halide::Tools::Image 类似,但可以选择进行交错布局。 (就个人而言,我尽量不在小型测试程序之外使用这些中的任何一个。有一个长期计划使所有这些合理化,这将在合并任意维度 buffer_t 分支后继续进行。另请注意 Halide::Image 需要 libHalide.a在 Halide::Tools::Image 不存在并且仅通过包含 common/halide_image.h 是头文件的地方进行链接。)

还有 Halide::Buffer 类,它是 buffer_t 的包装器,在即时 (JIT) 编译中很有用。它可以引用存储中传递的内容并且没有模板化。但是我的猜测是您想直接使用 buffer_t 并且只需要类型转换来分配主机。还要确保将 buffer_t 的 elem_size 字段设置为“sizeof(float)”。

对于交错的 float 缓冲区,你最终会得到类似这样的东西:

buffer_t buf = {0};
buf.host = (uint8_t *)float_data; // Might also need const_cast
// If the buffer doesn't start at (0, 0), then assign mins
buf.extent[0] = width; // In elements, not bytes
buf.extent[1] = height; // In elements, not bytes
buf.extent[2] = 3; // Assuming RGB
// No need to assign additional extents as they were init'ed to zero above
buf.stride[0] = 3; // RGB interleaved
buf.stride[1] = width * 3; // Assuming no line padding
buf.stride[2] = 1; // Channel interleaved
buf.elem_size = sizeof(float);

您还需要注意 Halide 代码本身的边界。可能最好查看 tutorial/lesson_16_rgb_generate.cpp 中的 set_stride 和 bound 调用以获取相关信息。

关于c++ - 将 Halide 与表示为 float 组的 HDR 图像一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36822003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com