分配OpenCV Mat对象会导致内存泄漏

Assigning OpenCV Mat object causes a memory leak

本文关键字:内存 泄漏 OpenCV Mat 对象 分配      更新时间:2023-10-16

我想将frame (Mat对象)从函数参数分配给对象变量,如下面的代码所示。这个函数应该被调用5次(对于来自摄像机的每一帧),但是这一行

this->nFrame = frame;

导致内存泄漏(当注释时没有错误!)。

注意函数setCurrentFrameJNI函数内部被调用,其中JNI函数在每次我想处理来自摄像机的帧时被调用。

JNI函数如下:

JNIEXPORT jbyteArray JNICALL Java_com_adhamenaya_Native_run(JNIEnv * env,
        jobject obj, jstring faceCascadeFile, jstring noseCascadeFile,
        jstring landmarks, jlong frame) {
    MyClass gsys;
    cv::Mat& inFrame = *(cv::Mat*) frame;
    gsys.setCurrentFrame(inFrame);

    // SOME PROCESSING FOR THE FRAME 

    inFrame.release();
    gsys.release();
    ......
    ......
}
c++函数(setCurrentFrame) 的代码
void MyClass::setCurrentFrame(cv::Mat& frame) {
    cv::Size2d imgRes;
    float resRatio;
    if (frame.cols > frame.rows) {
        //landscape
        imgRes.width = 640.0f;
        resRatio = frame.cols / 640.0f;
        imgRes.height = floor(frame.rows / resRatio);
    } else {
        //portrait
        imgRes.height = 640.0f;
        resRatio = frame.rows / 640.0f;
        imgRes.width = floor(frame.cols / resRatio);
    }
    //save scaled height, width for further use
    this->frameWidth = nFrame.cols;
    this->frameHeight = nFrame.rows;
    //set frame and increment frameCount
    this->nFrame = frame;
    this->frameCount++;
}
劳驾,你能帮我解决这个问题吗?我试图通过调用: 释放框架
void MyClass::release(void) {
    this->nFrame = cv::Mat();
}

什么也没发生,甚至像这样:

void MyClass::release(void) {
    this->nFrame.release();
}

还是同样的错误!

编辑

MyClass.h

class MyClass {
public:
    cv::Mat nFrame;
    MyClass ();
    ~MyClass ();
    void release (void);
    void setCurrentFrame(cv::Mat& frame);
};

在jni文件中,释放框架对象的顺序可能是错误的:

inFrame.release();
gsys.release();

应为

gsys.release();
inFrame.release();

因为当你释放源帧时,gsys中的帧引用无效