これが私の最初の投稿なので、何か間違っていたらごめんなさい:)。頑張ります。
私は現在、HDR 画像処理プログラムに取り組んでおり、Halide を使用してベース TMO を実装するつもりはありません。問題は、すべての画像がfloat配列として表されていることです(b1、g1、r1、a1、b2、g2、r2、a2、...のような順序で)。Halide を使用して画像を処理するには、Halide::Image クラスが必要です。問題は、それらのデータをそこに渡す方法がわからないことです。
誰でも助けることができますか、同じ問題を抱えていて答えを知っていますか?
編集:
ついに手に入れました!ジェネレーターの入力バッファーと出力バッファーにストライドを設定する必要があります。助けてくれてありがとう:-)
編集:
私は2つの異なる方法を試しました:
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 ですが、何を変更すればよいかわかりません。任意のヒント?