Javacv:Mat数据在使用方法后变为null

Javacv:Mat数据在使用方法后变为null,java,android,opencv,ffmpeg,javacv,Java,Android,Opencv,Ffmpeg,Javacv,我正在开发一个用于物体检测和计数的android应用程序。对于图像处理,我使用JavaCV(OpenCV和FFmpeg的Java包装器)。导入库之后,我能够成功地使用FFmpegFrameGrabber获取视频帧 我的问题:将帧转换为Mat对象并对该Mat对象执行某些操作后,数据变为空 代码: main活动 public类MainActivity扩展了AppCompatActivity{ OpenCVFrameConverter.ToMat converterToMat=新的OpenCVFra

我正在开发一个用于物体检测和计数的android应用程序。对于图像处理,我使用JavaCV(OpenCV和FFmpeg的Java包装器)。导入库之后,我能够成功地使用FFmpegFrameGrabber获取视频帧

我的问题:将帧转换为Mat对象并对该Mat对象执行某些操作后,数据变为空

代码:

main活动

public类MainActivity扩展了AppCompatActivity{
OpenCVFrameConverter.ToMat converterToMat=新的OpenCVFrameConverter.ToMat();
私有计数模块;
FFmpegFrameGrabber检索器;
阵列列表框架;
boolean frameloaded=false;
File folder=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u);
文件视频=新文件(文件夹“test.mp4”);
AndroidFrameConverter converterToBitmap=新的AndroidFrameConverter();
私有静态WebStreamer WebStreamer;
静止的{
加载库(“本机库”);
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终按钮按钮=(按钮)findViewById(R.id.btnLdFrames);
最终ImageView img=(ImageView)findViewById(R.id.ImageView);
setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
((文本视图)按钮).setText(“加载”);
新线程(newrunnable()){
公开募捐{
试一试{
按钮。可点击设置(错误);
按钮。setAlpha((浮动)0.3);
装载框架();
按钮。setAlpha((浮动)1);
}catch(FrameGrabber.e异常){
e、 printStackTrace();
}
}
}).start();
}
});
}
私有void LoadFrames()抛出FrameGrabber.Exception{
如果(!frameloaded){
frameloaded=true;
检索器=新的FFmpegFrameGrabber(视频);
frames=newarraylist();
Log.d(“帧”,“循环开始”);
retriever.start();
最终ImageView img=(ImageView)findViewById(R.id.ImageView);

对于(int i=0;我为什么不使用?一开始我使用OpenCV4Android sdk,但后来我需要FFmpeg,所以我切换到JavaCV。好的,我没有用JavaCV编码,但我在GitHub上看了一个例子,另外,看看为什么不使用?一开始我使用OpenCV4Android sdk,但后来我需要FFmpeg,所以我切换到JavaCV。好的,我没有用Ja编码但是我在GitHub上看了一个例子,看看
    public class MainActivity extends AppCompatActivity {



    OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat();


    private CountModule countModule;
    FFmpegFrameGrabber retriever;

    ArrayList<opencv_core.Mat> frames;
    boolean frameloaded = false;

    File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
    File video = new File(folder, "test.mp4");

    AndroidFrameConverter converterToBitmap = new AndroidFrameConverter();



    private static WebStreamer webStreamer;

    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        final Button button = (Button) findViewById(R.id.btnLdFrames);
        final ImageView img = (ImageView) findViewById(R.id.imageView);


        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                ((TextView) button).setText("Loading");
                new Thread(new Runnable() {
                    public void run() {

                        try {
                            button.setClickable(false);
                            button.setAlpha((float) 0.3);
                            LoadFrames();
                            button.setAlpha((float) 1);

                        } catch (FrameGrabber.Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

            }
        });
    }
    private void LoadFrames() throws FrameGrabber.Exception {
        if (!frameloaded){



            frameloaded = true;

            retriever = new FFmpegFrameGrabber(video);
            frames = new ArrayList<>();
            Log.d("Frame",": Start of loop");

            retriever.start();
            final ImageView img = (ImageView) findViewById(R.id.imageView);
            for (int i=0;i<50;i++){//155430
                retriever.setFrameNumber(i*100);
                Frame temp = new Frame();
                temp = retriever.grab();

                frames.add(converterToMat.convert(temp));

                Log.d("Frame",": " + i*100);



            }
            retriever.stop();

            countModule = new CountModule(frames);
            Log.d("Frame","CountModule instantiated");

        }
    }
}
public CountModule(ArrayList<Mat> frames){

    fgGBG = new Mat(frames.get(0).rows(),frames.get(0).cols(),frames.get(0).type());
    gbg = createBackgroundSubtractorMOG2();
    Mat maTemp = new Mat(frames.get(0).rows(),frames.get(0).cols(),frames.get(0).type());

    median = new Mat(frames.get(0).rows(),frames.get(0).cols(),frames.get(0).type());
    frames.get(0).copyTo(median);
    ;
    median = getMedian(frames);
    kernel2 = Mat.ones(11,11,CV_8U).asMat();
    kernel = Mat.ones(3,1,CV_8U).asMat();
    gbg.apply(median,fgGBG,0.001);

}