我正在使用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;
}
感谢您的帮助。
答案 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):
所以,在这种情况下你也没有释放。
如果我们再次查看cvtColor()
方法的代码,我们可以看到如何处理返回矩阵:
create()
我们的返回矩阵是直接分配的,但前一个矩阵未发布。
所以我们有两个选择:
deliverAndDrawFrame()
source code,添加...
modified = mListener.onCameraFrame(frame);
...
:选项1 (按照您的示例):
CameraBridgeViewBase
选项2 :
modified.release()