我想为各种图像数据类型实现图像管道。我正在定义一个Generator
类,其中包含描述管道的build()
方法,用于指定数据类型参数的GeneratorParam<type>
和用于指定输入图像的ImageParam
成员。如果我将ImageParam
的类型指定为上面定义的GeneratorParam<Type>
,那么无论我在执行生成器时指定的是什么类型,输入图像的类型始终是默认类型。如果我在ImageParam
方法的主体内复制build()
的声明,那么它似乎工作正常。这是使用可以具有不同类型的输入图像定义管道的正确方法吗?
这是我最初写的课程:
#include "Halide.h"
using namespace Halide;
class myGenerator : public Generator<myGenerator>
{
public:
// Image data type as a parameter of the generator; default: float
GeneratorParam<Type> datatype{"datatype", Float(32)};
// Input image to the pipeline
ImageParam input{datatype, 3, "input"}; // datatype=Float(32) always
// Pipeline
Func build()
{
// ...
}
};
如果我编译生成器并运行它以生成与默认值不同的datatype
的管道:
$ ./myGenerator -f pipeline_uint8 -o . datatype=uint8
然后一切似乎都很好,但是管道在运行时崩溃了,因为我传递给它的缓冲区是uint8,但它期望一个float类型的图像(我在生成器类中指定的默认值):
Error: Input buffer input has type float32 but elem_size of the buffer passed in is 1 instead of 4
我已经通过复制ImageParam
块内build()
的声明来解决了这个问题,但这对我来说似乎有点脏。有没有更好的办法?这是现在的课程:
#include "Halide.h"
using namespace Halide;
class myGenerator : public Generator<myGenerator>
{
public:
// Image data type as a parameter of the generator; default: float
GeneratorParam<Type> datatype{"datatype", Float(32)};
// Input image to the pipeline
ImageParam input{datatype, 3, "input"};
// Pipeline
Func build()
{
// Copy declaration. This time, it picks up datatype
// as being the type inputted when executing the
// generator instead of using the default.
ImageParam input{datatype, 3, "input"};
// ...
}
};
感谢。
答案 0 :(得分:4)
确实很脏。目前最着名的解决方案是使用构建顶部的正确类型重新初始化输入,而不是使用具有相同名称的另一个ImageParam对其进行遮蔽:
Func build()
{
input = ImageParam{datatype, 3, "input"};
...
}