Android 使用 OpenGL 处理相机帧
Android camera frame processing using OpenGL
我正在尝试在相机预览帧上应用人脸检测。我正在使用 OpenGL 和 OpenCV 在 运行 时间处理这些相机帧。
@Override
public void onDrawFrame(GL10 unused) {
if (VERBOSE) {
Log.d(TAG, "onDrawFrame tex=" + mTextureId);
}
mSurfaceTexture.updateTexImage();
mSurfaceTexture.getTransformMatrix(mSTMatrix);
// TODO: need to implement
//JniCppManager.processFrame();
drawFrame(mTextureId, mSTMatrix);
}
我正在尝试实现 processFrame() 的 C++ 实现。如何从转换矩阵中获取 C++ 中的 Mat 对象?谁能给我一些解决方案的建议。
您的管道目前是:
- 相机(产生画面)
- SurfaceTexture(接收帧,转换为 GLES "external" 纹理)
- [缺少内容]
- 传递给 C++ 的 RGB 字节数组
你需要为 [missing stuff] 做的是将像素渲染到屏幕外 pbuffer 并用 glReadPixels()
读回它们。您可以从用 Java 或本机编写的代码中执行此操作;对于前者,您希望将它们读入 "direct" ByteBuffer,以便您可以轻松地从本机代码访问像素。 GLES 使用的 EGL 上下文保存在线程本地存储中,因此 GLSurfaceView 渲染线程上的本机代码 运行 将能够访问它。
可以在 bigflake ExtractMpegFramesTest 中找到这方面的示例,它的主要区别在于它从视频而不是相机中抓取帧。
对于 API 19+,如果您可以在 YV12 或 NV21 而不是 RGB 中处理帧,则可以将相机提供给 ImageReader 并访问数据而无需 copy/convert它。
我正在尝试在相机预览帧上应用人脸检测。我正在使用 OpenGL 和 OpenCV 在 运行 时间处理这些相机帧。
@Override
public void onDrawFrame(GL10 unused) {
if (VERBOSE) {
Log.d(TAG, "onDrawFrame tex=" + mTextureId);
}
mSurfaceTexture.updateTexImage();
mSurfaceTexture.getTransformMatrix(mSTMatrix);
// TODO: need to implement
//JniCppManager.processFrame();
drawFrame(mTextureId, mSTMatrix);
}
我正在尝试实现 processFrame() 的 C++ 实现。如何从转换矩阵中获取 C++ 中的 Mat 对象?谁能给我一些解决方案的建议。
您的管道目前是:
- 相机(产生画面)
- SurfaceTexture(接收帧,转换为 GLES "external" 纹理)
- [缺少内容]
- 传递给 C++ 的 RGB 字节数组
你需要为 [missing stuff] 做的是将像素渲染到屏幕外 pbuffer 并用 glReadPixels()
读回它们。您可以从用 Java 或本机编写的代码中执行此操作;对于前者,您希望将它们读入 "direct" ByteBuffer,以便您可以轻松地从本机代码访问像素。 GLES 使用的 EGL 上下文保存在线程本地存储中,因此 GLSurfaceView 渲染线程上的本机代码 运行 将能够访问它。
可以在 bigflake ExtractMpegFramesTest 中找到这方面的示例,它的主要区别在于它从视频而不是相机中抓取帧。
对于 API 19+,如果您可以在 YV12 或 NV21 而不是 RGB 中处理帧,则可以将相机提供给 ImageReader 并访问数据而无需 copy/convert它。