6

cv::Mat::release()メソッドが C プログラミングに似ているかどうかfree()、つまり、メモリから Matrix データを解放するかどうかを確認したいと思います。

特に、メモリ リークに関するこのメソッドの動作を理解し、多くのプログラムでリークがないことを確認したいと思います。

4

4 に答える 4

6

cv::Mat オブジェクトは自動的に管理されるため、手動で割り当てを解除する必要はありません。この場合、Mat を Iplimage から初期化していない限り、deallocate() を手動で割り当て解除する必要があります。

このスレッドを参照してください。

IplImage と cv::Mat を混合する openCV

于 2013-04-08T09:27:04.880 に答える
0

次のプログラム スニペットは、 Mat::release() の動作をテストします ( opencv-org-answerから適応)

using namespace std;
using namespace cv;

int main(int argc, char **argv) {
    cout << "test_mat_release.cpp" << endl;

    {
        //memory is released
        const char *pzInputImg = "data/em_sample.png";

        Mat img;
        img = imread(pzInputImg);
        assert(img.data);
        img.release();
        assert(!img.data);
    }
    {
        //memory is released
        Mat img(100, 100, CV_32FC1);
        assert(img.data);
        img.release();
        assert(!img.data);
    }

    {   
        //Since Mat does not owns data , data is not released
        //you have to explicitly release data
        int cols=17;
        int rows=15;
        unsigned char * data = new unsigned char[rows*cols*3];
        Mat img(rows, cols, CV_8UC3, data);
        assert(img.data);
        img.release();
        assert(!img.data);
        delete [] data;
    }



    Mat imgRef;
    {
        //memory is not released
        //since there img.data is now shared with imgRef
        Mat img(100, 100, CV_32FC1);
        imgRef=img;
        assert(img.data);
        assert(img.data == imgRef.data);
        img.release();
        assert(img.empty());
        assert(!img.data);
        //img.data is NULL, but imgRef.data is not NULL, so data is not de-allocated
        assert(!imgRef.empty());
        assert(imgRef.data);
    }
    return 0;
}
于 2016-10-29T23:49:02.203 に答える