私はVS2013でHalideを使用しています。最初のチュートリアルを正常にビルドして実行しました。
コードの一部を実装しようとしていますが、コンパイルできない理由がわかりません。コードは次のとおりです。
int main(int argc, char **argv) {
ImageParam input(UInt(8), 3);
Func input_clamped = BoundaryConditions::repeat_edge(input);
Var x, y, c;
Func float_input_clamped;
float_input_clamped(x, y, c) = cast<float>(input_clamped(x, y, c)) / 255.0f;
Func input_lum;
input_lum(x, y) = cast<float>(0.299f * float_input_clamped(x, y, 0) + 0.587f * float_input_clamped(x, y, 1) + 0.114f * float_input_clamped(x, y, 2));
Func m45;
m45(x, y) = fabsf(input_lum(x - 1, y) - input_lum(x, y + 1)) + fabsf(input_lum(x, y + 1) - input_lum(x + 1, y + 2));
return 0;
}
エラーは m45(x, y) = ... 行で発生します。どうやら、input_lum は float 値とは見なされません。エラー メッセージは、「Halide::Expr から float への適切な変換が存在しない」というものです。
どうやらすべてのキャストとフロート計算が無視されているようです。
(私はまだ入力を初期化していないことを知っています.Halideコードを書くときの考え方を理解しようとしています,そして型推論は私に適合を与えています.)
ここで何が間違っていますか?
(はっきりしない場合は、RGB 画像の輝度を取得し、輝度を計算したいだけです。それが機能する場合は、整数空間にとどまることができれば幸いです。)
OK、私はこれを実験して試しました:
ImageParam input(UInt(8), 3);
Func input_clamped = BoundaryConditions::repeat_edge(input);
Var x, y, c;
Func input_lum;
input_lum(x, y) = 0.299f * input_clamped(x, y, 0) + 0.587f * input_clamped(x, y, 1) + 0.114f * input_clamped(x, y, 2);
Func m45;
m45(x, y) = abs(input_lum(x - 1, y) - input_lum(x, y + 1)) + abs(input_lum(x, y + 1) - input_lum(x + 1, y + 2));
これでコンパイルは完了しましたが、何をしているのかわかりません。input_lum() の型が float にならないのはなぜですか?