我正在尝试在相机预览帧上应用人脸检测。我正在使用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对象?任何人都可以向我提供解决方案的一些指示。
答案 0 :(得分:3)
您的管道目前正在:
你需要为[缺失的东西]做的是将像素渲染到屏幕外的pbuffer并用glReadPixels()
读回来。您可以使用Java或本机编写的代码执行此操作;对于前者,你想把它们读成一个"直接" ByteBuffer,您可以轻松地从本机代码访问像素。 GLES使用的EGL上下文保存在线程本地存储中,因此在GLSurfaceView呈现线程上运行的本机代码将能够访问它。
这个例子可以在bigflake ExtractMpegFramesTest中找到,其主要区别在于它从视频而不是摄像机中抓取帧。
对于API 19+,如果您可以处理YV12或NV21中的帧而不是RGB,则可以将相机送到ImageReader并访问数据,而无需复制/转换它。