1

これは非常に奇妙です..私はHalide(https://github.com/halide/Halide/)を使用していますが、発生するエラーはC++関連です。コードを実行すると、

*** glibc detected *** ./lesson_04: malloc(): memory corruption: 0x0000000000a36640 ***

「実現」も印刷されますが、「ぼかし初期」は印刷されません。シグマに 1.0 を渡すと機能しますが、2.0 または 3.0 では機能しません。これは、より長いコードの一部です。長いコードは 1 でも機能しません。値がどのように影響を与え、どこでスタックするのかわかりません。何か助けはありますか?ありがとう

#include <Halide.h>
#include <stdio.h>
#include <math.h>

#include "armadillo"
using namespace arma;

using namespace Halide;
#include "../apps/support/image_io.h"


Image<float> calculateGaussian(double sigmaD){
    int sigma=(int)sigmaD;
    Image<float> convolution(sigma*6+1,sigma*6+1); float sum=0;

    for (int i=-sigma*3; i<sigma*3+2; i++){
        for (int j=-sigma*3; j<sigma*3+2; j++){
            float r=std::sqrt(i*i+j*j);
            convolution(i+sigma*3,j+sigma*3)=std::exp(-r*r/(2*sigma*sigma));
            sum+=convolution(i+sigma*3,j+sigma*3);
        }
    }
    for (int i=0; i<sigma*6+1; i++){
        for (int j=0; j<sigma*6+1; j++){
            convolution(i,j)/=sum;
        }
    }
    return convolution;
}

Image<uint8_t> convolve(Image<uint8_t> im, Image<float> convolution){
    RDom r(convolution);
    int w=convolution.width(), h=convolution.height();
    int W=im.width(), H=im.height();
    Var x,y,c;
    Func blur, input;
    input(x, y,c) = im(clamp(x, 0, W-1), clamp(y, 0, H-1),c);   
    blur(x, y,c) = sum(cast<uint8_t>(convolution(r.x, r.y) * input(x + r.x - w/2, y + r.y - h/2,c)));
    Image<uint8_t> out=blur.realize(im.width(),im.height(),im.channels());
    return out;
}

Image<uint8_t> blurGaussian(Image<uint8_t> im, float sigma){
    printf("blur initial");
    Image<float> gaussian=calculateGaussian(sigma);

    return convolve(im,gaussian);
}

int main(int argc, char **argv) {

    Image<uint8_t> im1 = load<uint8_t>("../apps/images/stata-1.png");
    Image<uint8_t> output;
    printf("realizing \n");
    output=blurGaussian(im1,3.0);
    save(output, "blur.png");

    printf("Success!\n");
    return 0;
}
4

1 に答える 1

1

プログラムが途中で終了すると、出力が書き込みバッファにスタックし、実際にはコンソールに書き込まれないことがあります。電話fflush(stdout);をかけると、これが事実であるかどうかを判断するのに役立ちます。または、バッファリングされていないfprintf(stderr, ...)ため、デバッグ出力に使用します。stderr

ただし、より可能性が高いのは、プログラムが実際にクラッシュするのは、印刷の「実現」と「初期のぼかし」の間に発生する 1 つの主要なタスクであるImage<uint8_t>コピー コンストラクターです。

なぜあなたが値渡しをしていて、コピーを引き起こすのかは私にはわかりませんconst。大きなオブジェクトのコピーを避けるために、そこに参照を置きたいと思います。それでも、コピー コンストラクターにバグがある場合は、最初にそれを見つけて修正する価値があります。

于 2013-06-27T03:35:58.850 に答える