从服务到活动(SurfaceView)发送OpenCV图像(或位图)

时间:2013-02-25 20:15:45

标签: android opencv service android-activity surfaceview

我正在开发一个安装了一些服务的Android应用程序 持续而昂贵的处理(它利用OpenCV来抓取相机图像 并对其进行一些处理)。我希望我的活动能够连接和断开连接 从服务到设备上做其他事情并查看处理 (主要用于调试,但我也可以看到其他用例)。

问题是我不确定如何设计这个应用程序 - 我也是Android编程的新手。

由于它是一个性能关键应用程序,我想我无法通过位图 对活动的服务,所以我想我想将SurfaceView耦合到 一旦活动到达前台就开始服务。

如下所示 - 注意:它不是一个完整的例子,它只是显示流程

public class MainActivity extends Activity {
    private OpenCVCameraService mService;
    private SurfaceView mSurfaceView;
    @Override
    public void onCreate() {
        // show UI
        // start mService with mSurfaceView
    }
}

public class OpenCVCameraService extends Service {
    private Processing mProcessing;
    private SurfaceView mSurfaceView;
    @Override
    public void onCreate() {
        // setup OpenCV camera stuff
        // init mProcessing with mSurfaceView
    }
}

public class Processing extends Thread {
    private VideoCapture mCamera;
    private SurfaceView mSurfaceView;   // maybe just the SurfaceHolder
    Processing(VideoCapture camera, SurfaceView surfaceView) {
        mCamera = camera;
        mSurfaceView = surfaceView;
    }
    @Override
    public void run() {
        mCamera.grab();
        mCamera.retrieve(...);
        // process retrieved images
        // image to bitmap
        // What now, how to get bitmap to MainActivity? Passing using intent is a performace hit I guess
        // maybe something like if (mSurfaceView != null) { Canvas canvas = mSurfaceView.lockSurface(); ... }
    }
}

您将如何设计此类应用程序?还有什么我需要考虑的吗?

1 个答案:

答案 0 :(得分:1)

好的,我就是这样做的:我已经将SurfaceView设置为正确的视图(如果app正在运行),如果没有(即暂停),则将其设置为MainActivity的onServiceConnected / onServiceDisconnected。在服务中,我检查视图是否存在。它不是最好的解耦,但它的工作原理,据我所知,现在表现还不错。