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

Hux*_*ell 3 android opencv parcelable

我试图将 CvCameraViewFrame 或 Mat 发送到另一个活动,但它们没有实现 Serializable 或 Parcelable 并且为它们创建一个包装类只是为了使用它一次似乎有点矫枉过正。我该如何进行?

Kir*_*ran 5

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

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

  1. 共享- 使用全局Application子类来获取/设置Mat最好的东西,比如HashMap<String, WeakReference<Mat>>在活动中传递 HashMap 的键字符串(1)。确保您存储了对Matbefore child 活动完成的强引用onResume(),否则Mat可能会被垃圾收集。

  2. 复制- 使用getNativeObjAddr( 2 ) 并将long地址值作为调用 Intent 的一部分传递。子活动将Mat使用本机地址(3)重新创建。Mat在子活动中克隆是必要的,因为在onResume子活动完成后的任何时间都可以终止父活动。

示例如下。

// 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();  
Run Code Online (Sandbox Code Playgroud)

  • 什么是 tempImg(addr) ? (2认同)