我是 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/