android - cv::OutOfMemoryError 在 onCameraFrame 方法中由 Mat.clone() 抛出

标签 android c++ opencv

我是 Opencv4Android 的新手,遇到无法解决的错误。 基本上我的程序依赖于我以这种方式实现的 onCameraFrame 方法:

public Mat onCameraFrame(CvCameraView inputFrame)
{
    Mat m = inputFrame.rgba().clone();
    //Do some stuff
    return m;
}

该程序似乎运行良好,但在处理了一些帧后它停止并返回以下错误:

E/AndroidRuntime(9841): at org.opencv.core.Mat.clone(Mat.java:834)
E/AndroidRuntime(9841): at it.unive.featuretracking.FeatureTrackingTestActivity.onCameraFrame(FeatureTrackingTestActivity.java:95)
E/AndroidRuntime(9841): at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387)
E/AndroidRuntime(9841): at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:328)
E/AndroidRuntime(9841): at java.lang.Thread.run(Thread.java:841)

此外,我还打印了 Mat.clone()

抛出的异常信息
E/Error(16954): cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/alloc.cpp:52: error: (-4) Failed to allocate 8294404 bytes in function void* cv::OutOfMemoryError(std::size_t)

我认为原因是 Mat.clone() 方法。如果我理解正确的话,缓冲区达到限制是因为它没有及时释放。我对吗? 我该如何修复该程序?

编辑: 好的,我不知道这是否是正确的解决方案,但似乎该程序现在可以使用以下代码:

Mat m = null;  //declared as a field

...

public onCameraFrame(CvCameraView inputFrame)
{
    if (m != null)
    {
        m.release();
    }
    m = inputFrame.rgba().clone();
    //Do some stuff
    return m;
}

最佳答案

我认为问题在于您在从相机接收到的每一帧上都创建了一个新的 Mat 对象实例。每次调用 Mat m = inputFrame.rgba().clone(); (onCameraFrame...) 时,您都会创建一个新对象 (Mat...),它会占用一些内存。一段时间后,您一定会填满设备的 RAM。

我建议你尝试在 onCameraViewStarted 方法中定义一次 Mat m = new Mat(); (出现在大多数 opencv4android 教程中)然后尝试 m = inputFrame.rgba().clone();onCameraFrame 中。

关于android - cv::OutOfMemoryError 在 onCameraFrame 方法中由 Mat.clone() 抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340827/

相关文章:

android - 使用按钮 onClick 获取图像

android - 如何在 JSON 对象中添加字符串数组?

java - Android webview 应用程序不会加载我的表单

android - 使用谷歌助手通过语音测试应用程序操作的正确语法是什么?

c++ - 在 C++ 中计算单 channel 直方图的均值和标准差

c++ - 为什么我不能在此链接列表中打印第一个元素?

c++ - Lua - 初始化

c++ - 求介绍nmake & makefile结构

opencv - 存在相机抖动时的基准标记检测

c++ - 在 OpenCV 中展开一组矩形以形成正方形网格