Аргумент буфера равен NULL - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в Halide, и мне был предоставлен конвейер обработки изображений. Я пытаюсь понять этот конвейер, печатая значения. Следуя руководству из https://halide-lang.org/tutorials/tutorial_lesson_04_debugging_2.html, я попытался распечатать значения. Это дает мне 2 типа ошибок.

1. Аргумент буфера in_patch равен NULL для transform.realize (512,256,3) .

2. 'Halide :: Internal :: GeneratorBase :: Input> {aka class Halide :: GeneratorInput>}' не имеет члена с именем «реализовать» для TsTw_tran_h.realize (3,3) ;

Я предполагаю, что вторая ошибка как-то связана с неиспользованием переменных x и y.

Есть ли способ обойти первую ошибку?

Любая помощь будет принята с благодарностью.

Заранее спасибо

#include "Halide.h"

namespace {

using namespace Halide;

///////////////////////// We will define a generator to auto-schedule.
class AutoScheduled : public Halide::Generator<AutoScheduled> {
public:
    Input<Buffer<uint8_t>>   in_patch   {"in_patch"   , 3};
    Input<Buffer<float>>   ctrl_pts_h {"ctrl_pts_h" , 2};      
    Input<Buffer<float>>   weights_h  {"weights_h"  , 2};       
    Input<Buffer<float>>   rev_tone_h {"rev_tone_h" , 2};       
    Input<Buffer<float>>   TsTw_tran_h{"TsTw_tran_h", 2};       
    Input<Buffer<float>>   coefs_h    {"coefs_h"    , 2};       

    Output<Buffer<uint8_t>> processed {"processed"  , 3};

    void generate() {  
    Var x("x"), y("y"), c("c");

        Func scale("scale");
        scale(x,y,c) = cast<float>(in_patch(x,y,c))/256;

        // Color map and white balance transform

        Func transform("transform");
            transform(x,y,c) = select(
                // Perform matrix multiplication, set min of 0
                c == 0, scale(x,y,0)      * TsTw_tran_h(0,0)
                      + scale(x,y,1)      * TsTw_tran_h(1,0)
                      + scale(x,y,2)      * TsTw_tran_h(2,0),
                c == 1, scale(x,y,0)      * TsTw_tran_h(0,1)
                      + scale(x,y,1)      * TsTw_tran_h(1,1)
                      + scale(x,y,2)      * TsTw_tran_h(2,1),
                        scale(x,y,0)      * TsTw_tran_h(0,2)
                      + scale(x,y,1)      * TsTw_tran_h(1,2)
                      + scale(x,y,2)      * TsTw_tran_h(2,2) );
                      scale.compute_root();
                      transform.trace_stores();
                      scale.trace_stores();
                      TsTw_tran_h.realize(3,3);
                      transform.realize(512,256,3);

        processed(x, y, c) = cast<uint8_t>( min( max( transform(x,y,c) * 255, 0), 255 ) ); 
    }

1 Ответ

0 голосов
/ 14 июня 2020

Оказывается проблема была в расписании. Все функции были встроены из-за автоматического расписания. Как только auto_schedule был отключен, он работал.

...