这是我在这里的第一篇文章,如果我做错了什么,很抱歉:)。我会尽力做到最好。
我目前正在开发我的 HDR 图像处理程序,我将使用 Halide 实现一些基于 TMO。问题是我所有的图像都表示为浮点数组(顺序如下: 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 * 主机更改为 float_t * 主机,但我认为这不是个好主意。
编辑:
我尝试将下面的代码与我的浮动图像(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;
}
不幸的是,我遇到了味精崩溃:
Error: Constraint violated: f0.stride.0 (4) == 1 (1)
我认为这行有问题:output_buf.stride[0] = buf.stride[0] = 4,但我不确定我应该改变什么。有小费吗?