如何将OpenCV Mat作为putExtra发送到Android Intent?

时间:2015-03-15 12:04:01

标签: android opencv parcelable

我正在尝试将CvCameraViewFrame或Mat发送到另一个活动,但他们没有实现Serializable或Parcelable并为它们创建一个包装类只是为了使用它一次看起来像是一种过度杀伤。 我该怎么办?

2 个答案:

答案 0 :(得分:3)

我会使用片段而不是活动,并从片段中获取/设置容器Activity中存在的公共Mat

如果需要坚持多项活动,假设它在进程中,则选项

  1. 分享 - 使用全局Application子类来获取/设置Mat,最好是HashMap<String, WeakReference<Mat>>之类的东西,并传递HashMap&#39; s跨活动的关键字符串(1)。确保在子活动完成Mat之前存储对onResume()的强引用,否则Mat可能被垃圾收集。

  2. 正在复制 - 使用getNativeObjAddr2)并传递long地址值作为调用Intent的一部分。子活动将使用本机地址(3)重新创建Mat。必须在子项中克隆Mat,因为在onResume子活动完成后,父项活动可能会被杀死。

  3. 以下示例。

    // In parent activity
    Mat img = ...;
    long addr = img.getNativeObjAddr();
    Intent intent = new Intent(this, B.class);
    intent.putExtra( "myImg", addr );
    startActivity( intent );
    
    //In child activity
    long addr = intent.getLongExtra("myImg", 0);
    Mat tempImg = new Mat( addr );
    Mat img = tempImg.clone();  
    

答案 1 :(得分:0)

@Kiran是对的。

您应该使用其原生地址获取Matrix的实例。

long frameAddress = intent.getLongExtra("extra_name", 0);
Mat m = new Mat(frameAddress);