我在 VS2013 中使用卤化物。我已经成功构建并运行了第一个教程。
我正在尝试实现我的一些代码,但不明白为什么它不会编译。代码如下:
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 不被视为浮点值。错误消息是“不存在从 Halide::Expr 到 float 的合适转换。”
显然所有的演员表和浮动数学都被忽略了。
(我知道我还没有初始化输入——我试图理解我在编写 Halide 代码时的思考方式,而类型推断让我很适应。)
我在这里做错了什么?
(如果不清楚,我只想获取 RGB 图像的亮度,并对亮度进行一些数学运算。如果可行,我会很高兴留在整数空间中。)
好的,我试验并尝试了这个:
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() 的类型不是浮点数?