【问题标题】:Assigning OpenCV Mat object causes a memory leak分配 OpenCV Mat 对象会导致内存泄漏
【发布时间】:2016-01-17 01:42:40
【问题描述】:

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

this->nFrame = frame;

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

注意 setCurrentFrame 函数在 JNI 函数内部调用,其中 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);

};

【问题讨论】:

  • @Miki 我已经编辑了问题。
  • 您使用哪种工具来检测泄漏?
  • 使用安卓adb。我对泄漏的信息很少,这条消息10-18 21:57:59.399: A/libc(15001): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x80000 in tid 15113 (Thread-8815)@RonaldoMessi

标签: android c++ opencv memory-leaks android-ndk


【解决方案1】:

在jni文件中,释放frame对象的顺序可能有误:

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

应该是

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

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

【讨论】:

  • 你的意思是,应该是gsys.release(); inFrame.release();
  • 谢谢,我现在不能尝试。稍后我会尽快回复。
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多