建议发布CvCameraViewFrame inputFrame?

时间:2016-10-23 13:13:02

标签: android opencv opencv4android opencv3.1

我正在使用JavaCameraView的Android应用中工作。所以在我的活动中,我实现了CvCameraViewListener2

onCameraFrame()的实现如下:

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    final Mat frame = inputFrame.rgba();
    return bs.process(frame);
}

我的问题是:如果我发布frame因为我不再使用它会不会很好?所以做这样的事情:

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    final Mat frame = inputFrame.rgba();
    Mat result = bs.process(frame);
    frame.release();
    return result;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

没有发布inputFrame矩阵,但您必须小心使用返回矩阵。

<强>解释

来自onCameraFrame()的{​​{1}}方法中的

deliverAndDrawFrame()回调is called

CameraBridgeViewBase
来自protected void deliverAndDrawFrame(CvCameraViewFrame frame) { Mat modified; if (mListener != null) { modified = mListener.onCameraFrame(frame); } else { modified = frame.rgba(); } ... } 的{​​{1}}中的

deliverAndDrawFrame()方法is called

CameraWorker

JavaCameraView... if (!mStopThread && hasFrame) { if (!mFrameChain[1 - mChainIdx].empty()) deliverAndDrawFrame(mCameraFrame[1 - mChainIdx]); } ... 类型的数组。如果查看this class,您可以看到矩阵的来源:

mCameraFrame

如果是JavaCameraFrame

@Override public Mat gray() { return mYuvFrameData.submat(0, mHeight, 0, mWidth); } @Override public Mat rgba() { Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4); return mRgba; } 是一个匹配is reused的每个新框架的广告 - &gt;你不必释放它。

如果是gray()

mYuvFrameData已转换为rgba()mYuvFrameData是在构造函数中初始化的类成员,每次都重用。 mRgba方法在dst矩阵中使用mRgba方法allocate space。此方法的工作原理如下(JavaDoc):

  • 如果当前阵列形状和类型与新形状匹配,立即返回
  • 否则,通过调用&#34; Mat.release&#34; 取消引用先前的数据。
  • ...

所以,在这种情况下你也没有释放。

返回矩阵

如果我们再次查看cvtColor()方法的代码,我们可以看到如何处理返回矩阵:

create()

我们的返回矩阵是直接分配的,但前一个矩阵未发布

所以我们有两个选择:

  1. 重复使用我们的返回矩阵将其转换为类成员(推荐)。
  2. 修改deliverAndDrawFrame() source code,添加... modified = mListener.onCameraFrame(frame); ...
  3. 选项1 (按照您的示例):

    CameraBridgeViewBase

    选项2

    modified.release()