gpt4 book ai didi

后台 OpenCV 中的 Android 摄像头

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:01 28 4
gpt4 key购买 nike

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

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

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

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

提前致谢。

最佳答案

我使用过 OpenCV 和 Android Camera。开始并不难。我使用 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 .

关于后台 OpenCV 中的 Android 摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715736/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com