使用Vector时应用程序停止<;Mat>;或列表<;Mat>;在Android的OpenCV中

使用Vector时应用程序停止<;Mat>;或列表<;Mat>;在Android的OpenCV中,android,list,opencv,vector,split,Android,List,Opencv,Vector,Split,我正在为一个Android项目使用OpenCV库。问题是,当我想将图像分成3个通道(我只想使用绿色通道)时,我声明了一个List,以便使用split()方法: public Mat onCameraFrame(CvCameraViewFrame inputFrame) { input = inputFrame.rgba(); Vector<Mat> channels = new Vector<Mat>(3); Core.split(in

我正在为一个Android项目使用OpenCV库。问题是,当我想将图像分成3个通道(我只想使用绿色通道)时,我声明了一个
List
,以便使用
split()
方法:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    input = inputFrame.rgba();      
    Vector<Mat> channels = new Vector<Mat>(3);
    Core.split(input, channels);        
    canny = channels.get(1);

    /*

    other code

    */

    return canny;
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame){
input=inputFrame.rgba();
向量通道=新向量(3);
核心。拆分(输入、通道);
canny=channels.get(1);
/*
其他代码
*/
回归精明;
}
问题是,在20-30秒内(取决于摄像头的分辨率),我的手机内存耗尽并关闭应用程序。如何在每次调用
onCameraFrame
时清理内存


谢谢

我在Java版本中遇到了同样的问题,所以它似乎是cv::split()包装中的一个bug。我现在使用Core.extractChannel()实现同样的目的,并且没有内存泄漏

Mat rgba = inputFrame.rgba();
Mat yuv = new Mat();
Imgproc.cvtColor(rgba, yuv, Imgproc.COLOR_RGB2YCrCb);
Mat y = new Mat();
Core.extractChannel(yuv, y, 0);
Mat u = new Mat();
Core.extractChannel(yuv, u, 1);
Mat v = new Mat();
Core.extractChannel(yuv, v, 2);

您需要将变量Mat初始化为函数“onCameraViewStarted”


欢迎来到堆栈溢出。请将您的回答限制为实际提供问题答案的回答。对附加信息的评论或请求应仅限于评论,而不是回答。正确回答一两个问题,你就应该有足够的声誉,可以不受限制地发表评论。
public void onCameraViewStarted(int width, int height) {

    mRgba = new Mat();
    r = new Mat();
    g = new Mat();
    b = new Mat();


}