Это мое первое сообщение здесь, так извините, если я что-то сделаю не так :). Я постараюсь сделать все возможное.Использование галогенида с изображениями HDR, представленными как массив с плавающей точкой
В настоящее время я работаю над своей программой обработки изображений HDR, и я выиграл некоторые базовые TMO с использованием Halide. Проблема заключается в том, что все мои изображения представлены как массивы с плавающей запятой (с порядком вроде: b1, g1, r1, a1, b2, g2, r2, a2, ...). Использование Halide для обработки изображения требует Halide :: Image class. Проблема в том, что я не знаю, как передать эти данные.
Любой может помочь или иметь такую же проблему и знать ответ?
Редактировать:
Наконец-то получилось! Мне нужно установить шаг на входном и выходном буфере в генераторе. Thx все за помощь :-)
Edit:
Я попробовал два способа:
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 to float_t * host, но я не думаю, что это хорошая идея.
Edit:
Я попытался с помощью кода ниже моей флоат изображения (RGBA):
поколение функции АОТ:
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, но я не уверен, что мне следует изменить. Какие-нибудь советы?
Привет и добро пожаловать! Не могли бы вы показать нам код, который вы пробовали? – rhughes
Я пытался использовать buffer_t и normal Halide :: Image, но оба они используют uint8 not float data: int halideOperations (float data [], int size, int x, int y) { \t \t buffer_t input_buf = {0 }; \t \t input_buf.host = & data [0]; } или: \t \t Halide :: Image (Halide :: Type :: Float, x, y, 0, 0, data); –
Спасибо. Не могли бы вы изменить свой вопрос, чтобы показать нам свой код? – rhughes