Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cv::Mat内存即使在调用release()后也不会释放?_C++_Opencv_Computer Vision_Sift_Vlfeat - Fatal编程技术网

C++ cv::Mat内存即使在调用release()后也不会释放?

C++ cv::Mat内存即使在调用release()后也不会释放?,c++,opencv,computer-vision,sift,vlfeat,C++,Opencv,Computer Vision,Sift,Vlfeat,我编写了一个方法,其中图像描述符(如或FT)计算一组图像的描述符(保存在std::vector files)。通过computedDescriptors(image,descriptorMatrix)调用描述符,在descriptorMatrix中填充从中计算的描述符 然后我随机选取样本(通常为50个)描述符,并将样本描述符矩阵推送到返回的std::vector描述符 代码如下: void SIFTDescriptor::ComputeDescriptorsRange(const std::ve

我编写了一个方法,其中图像描述符(如或FT)计算一组图像的描述符(保存在
std::vector files
)。通过
computedDescriptors(image,descriptorMatrix)
调用描述符,在
descriptorMatrix
中填充从中计算的描述符

然后我随机选取
样本
(通常为50个)描述符,并将
样本描述符
矩阵推送到返回的
std::vector描述符

代码如下:

void SIFTDescriptor::ComputeDescriptorsRange(const std::vector<std::string> &files, std::vector<cv::Mat1f> &descriptors){
    cv::Mat1f imgDescriptors;
    cv::Mat img;
    for(int i=0 ; i<files.size() ; i++){
        std::cout<<"Describing "<<files[i]<<std::endl;
        img = cv::imread(files[i], cv::IMREAD_GRAYSCALE);
        if(!img.data)
            //throw error
        //resoze dim is a class member
        if(resizeDim>0)
            ImgUtility::resize(img,resizeDim);
        ComputeDescriptors(img,imgDescriptors);
        if(samples > 0 && samples < imgDescriptors.rows){
            std::cout<<"Sampling "<<imgDescriptors.rows<<" descriptors..."<<std::endl;
            cv::Mat1f sampledDescripotrs;
            std::vector<int> v(imgDescriptors.rows);
            std::iota (std::begin(v), std::end(v), 0); //fill v with 0 ... imgDescriptors.rows
            std::random_device rd;
            std::mt19937 g(rd());
            std::shuffle(v.begin(), v.end(), g);
            for(int j=0 ; j<samples; j++){
                sampledDescripotrs.push_back(imgDescriptors.row(v[j]));
            }
            descriptors.push_back(sampledDescripotrs);
            sampledDescripotrs.release();
        }
        else
            descriptors.push_back(imgDescriptors); //copy of a smart pointer, not expensive
        imgDescriptors.release();
        std::cout<<"descriptors["<<i<<"]="<<descriptors[i].rows<<std::endl;
        std::cout<<descriptors[i]<<std::endl;
    }

我自己发现了这个问题:显然
free(dsift)
没有取消分配所创建的描述符,所以我将它们堆积在堆上而没有释放它们

调用:
vl\u sift\u delete(dsift)
似乎解决了这个问题

void DSIFTVLFeat::ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors){
    descriptors.release();

    // transform image in cv::Mat to float vector
    cv::Mat imgFloat;
    img.convertTo(imgFloat, CV_32F, 1.0/255.0);
    if(!imgFloat.isContinuous())
        throw std::runtime_error("imgFloat is not continous");

    for(int i=binSize; i<=maxBinSize; i+=2){
        VlDsiftFilter *dsift = vl_dsift_new_basic (img.rows, img.cols, step, i);
        vl_dsift_process (dsift, imgFloat.ptr<float>());
        cv::Mat scaleDescs(vl_dsift_get_keypoint_num(dsift), 128, CV_32F, (void*) vl_dsift_get_descriptors(dsift));
        descriptors.push_back(scaleDescs);
        scaleDescs.release();
        free(dsift);
    }
}