1

我写了一个程序,允许你应用一个简单的指数滤波器。我使用 Valgrind 来跟踪程序中的错误。这向我显示了一条我无法理解的错误消息。

这是 valgrind 错误消息:

=5842== Conditional jump or move depends on uninitialised value(s)
==5842==    at 0x51B1A7A: ??? (in /usr/lib/libopencv_core.so.2.3.1)
==5842==    by 0x51B983C: cv::Mat::convertTo(cv::_OutputArray const&, int, double, double) const (in /usr/lib/libopencv_core.so.2.3.1)
==5842==    by 0x401997: filtrage(cv::Mat&, cv::Mat const&, long, long, double) (in /home/toto/Documents/vision_taff/openCv/rehaussemen_de_contraste/main)
==5842==    by 0x402487: main (in /home/toto/Documents/vision_taff/openCv/rehaussemen_de_contraste/main)
==5842==  Uninitialised value was created by a heap allocation
==5842==    at 0x4C2AC27: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5842==    by 0x40129B: application_filtre(double*, cv::Mat const&, long, long, double) (in /home/toto/Documents/vision_taff/openCv/rehaussemen_de_contraste/main)
==5842==    by 0x401899: filtrage(cv::Mat&, cv::Mat const&, long, long, double) (in /home/toto/Documents/vision_taff/openCv/rehaussemen_de_contraste/main)
==5842==    by 0x402487: main (in /home/toto/Documents/vision_taff/openCv/rehaussemen_de_contraste/main)
==5842==

这是我的主要程序:

#include"filtre.h"

using namespace std;
using namespace cv;

int main(int argc, char* argv[]) 
{
    Mat image;
    Mat imageFiltree;

    // Load the image                       
    image = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);

    if(argc != 2 || !image.data)
    {
        printf( "No image data \n" );
        return -1;
    }                  
    // apply the filter                                                                                                                     
    filtrage(imageFiltree, image, 15, 15, 1.);       
    // Display the result                                                                                                                
    namedWindow("image d'origine", CV_WINDOW_AUTOSIZE);
    namedWindow("image filtree", CV_WINDOW_AUTOSIZE);

    imshow("image d'origine", image);
    imshow("image filtree", imageFiltree);

    waitKey(0);

    return 0;        
}

我的过滤功能:

#include "filtre.h"

using namespace std;
using namespace cv;

//exponential kernel
void noyau_exponentiel(long size, double *h, double beta)
{
    double constante = beta / 2.;
    for(int i = 0, x = -size/2; i < size, x <= size/2; ++i, ++x)
        h[i] = constante * exp(-beta * abs(x));
    return ;
}

//which applies the filter function
void application_filtre(double *imageFiltree, Mat const& image, long sizeH1, long sizeH2, double beta)
{
    double *h1 = new double[sizeH1], *h2 = new double[sizeH2];
    long  width = image.cols, height = image.rows;
    double *dataImage = (double*)image.data;
    double *imageTemp = new double[width*height];

    assert(h1 && h2 && imageTemp);

    noyau_exponentiel(sizeH1, h1, beta);
    noyau_exponentiel(sizeH2, h2, beta);

    // Horizontal filtering                                                                                                                     
    for(long y = sizeH2/2; y < height - sizeH2/2; ++y)
        for(long x = sizeH1/2; x < width - sizeH1/2; ++x)
        {
            imageTemp[y*width + x] = 0.;
            for(long i = -sizeH1/2; i <= sizeH1/2; ++i)
                imageTemp[y*width + x] += dataImage[y*width + x+i] * h1[sizeH1/2 + i];
        }
    // Vertical filtering                          
    for(long y = sizeH2/2; y < height - sizeH2/2; ++y)
        for(long x = sizeH1/2; x < width - sizeH1/2; ++x)
        {
            imageFiltree[y*width + x] = 0.;
            for(long i = -sizeH2/2; i <= sizeH2/2; ++i)
                imageFiltree[y*width + x] += imageTemp[(y+i)*width +x] * h2[sizeH2/2 + i];
        }
    // Release the memory                                                                                                                
    delete[] imageTemp;
    delete[] h1;
    delete[] h2;

    return;
}

void filtrage(Mat &imageFiltree, Mat const &image, long sizeH1, long sizeH2, double beta)
{
    Mat imageCopie;
    Mat imagePadding;
    Mat imagePaddingFiltree;
    double *dataPaddingFiltree = new double[(image.cols + sizeH1 - 1) * (image.rows + sizeH2 -1)];

    // copy of the original image and conversion to a depth of 64 bits                                                                   
    image.convertTo(imageCopie, CV_64F, 1./255.);

    // Create the image padding                                                                                                             
    imagePadding = Mat(image.cols + sizeH1 - 1, image.rows + sizeH2 -1, CV_64FC1);
    copyMakeBorder(imageCopie, imagePadding, sizeH2 / 2, sizeH2 /2, sizeH1 /2, sizeH1/2, BORDER_CONSTANT, cvScalar(0,0,0));

    // apply the filter                                                                                               
    application_filtre(dataPaddingFiltree, imagePadding, sizeH1, sizeH2, beta);
    imagePaddingFiltree = Mat(imagePadding.cols, imagePadding.rows, CV_64FC1, dataPaddingFiltree);

    // Extract the image without padding + image conversion (depth 8 bits)                                                                
    Rect roi(sizeH1/2, sizeH2/2, image.cols, image.rows);
    Mat temp = imagePaddingFiltree(roi);
    temp.convertTo(imageFiltree, CV_8U, 255);

    // Release the memory                                                                                                                 
    delete[] dataPaddingFiltree;
}

消息是什么意思?

4

0 回答 0