【问题标题】:Android Camera in Background OpenCV后台 OpenCV 中的 Android 摄像头
【发布时间】:2015-02-27 05:24:21
【问题描述】:

我是 Android 版 openCV 的新手,我需要一个可以在后台进行图像处理(检测图像线条)的应用。

我已经制作了一个应用程序,它可以完成我需要的所有图像处理(使用 jni),但它在后台不起作用,它使用 CvCameraViewListener2(我认为它在服务中不起作用)

对于我已经搜索过的最好方法是使用表面纹理创建服务,但我不明白如何。 (已经看过全景活动)

那么我可以“转换”我在服务中完成的工作(使用 CvCameraViewListener2)然后在后台工作吗?还是我必须使用表面纹理从 0 开始做所有事情?

提前致谢。

【问题讨论】:

    标签: android opencv background camera frame


    【解决方案1】:

    我曾使用过 OpenCV 和 Android 相机。开始并不难。我使用 JNI 来处理帧。你需要做的事情。

    • 使用 android.hardware.Camera
    • 创建一个扩展 SurfaceHolder.Callback 和 Camera.PreviewCallback 的类

    OnPreviewFrame 方法中,获取byte[] 数据,该数据很可能采用NV21 (YUV) 的格式,因此您需要将其转换为RGBA 或任何适合您需要的格式。获取帧数据后,应创建一个后台线程来处理帧,以免阻碍 UI 线程。

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        if (data == null) {
            Log.i(TAG, "data is null");
            return;
        }
    
        int expectedBytes = previewWidth * previewHeight *
                ImageFormat.getBitsPerPixel(ImageFormat.NV21) / 8;
    
        if (expectedBytes != data.length) {
            Log.e(TAG, "Mismatched size of buffer! Expected ");
    
            mState = STATE_NO_CALLBACKS;
            mCamera.setPreviewCallbackWithBuffer(null);
            return;
        }
    
        if (mProcessInProgress) {
            mCamera.addCallbackBuffer(data);
            return;
        }
    
        if (mState == STATE_PROCESS) {
            mProcessInProgress = true;
    
            processDataTask = new ProcessPreviewDataTask();
            processDataTask.execute(data);
    
        } else {
            mCamera.addCallbackBuffer(data);
            return;
        }
    
    }
    

    private class ProcessPreviewDataTask
            extends
                AsyncTask<byte[], Void, Boolean> {
    
        @Override
        protected Boolean doInBackground(byte[]... datas) {
            mState = STATE_PROCESS_IN_PROGRESS;
            Log.i(TAG, "background process started");
            byte[] data = datas[0];
    
            /* JNI Call here */
    
            mCamera.addCallbackBuffer(data);
            mProcessInProgress = false;
            return true;
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            mState = STATE_PROCESS;
            threadInProcess = false;
        }
    }
    

    我有一个您可以使用的示例代码。你可以找到它here

    【讨论】:

    • 我还有一个问题.. 我有 2 个程序: 1 - 执行图像处理的东西 2 - 另一个执行我需要的其他东西的程序 2 调用 1 来制作图像处理东西(就像服务一样,因为我不想显示任何内容,程序 2 应该继续工作)所以我相信我真正需要的是程序 1 作为服务。所以运行调用程序 1 服务的程序 2,然后当程序 2 关闭时,它会关闭服务 1。这里的问题是如何让这个程序 1 作为服务工作?
    • 这真是令人困惑。您想将图像处理部分作为服务运行吗?这是否仅包括图像处理或访问相机?我制作的一个应用程序做了类似的事情。它可以创建长时间曝光的照片。因此,当用户按下开始按钮时,图像处理部分启动,当用户按下停止按钮时,图像处理部分停止。此外,还包括暂停和恢复。你在寻找类似的东西吗?
    • 我需要一个可以访问相机并进行图像处理的应用程序。 (实时处理)该应用程序/服务或类似的东西需要在另一个应用程序执行其他操作时继续工作。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多