我正在尝试使用OpenCV和OpenGL在脸上叠加贴纸。
我在onDrawFrame中获取了ByteBuffer:
@Override
public void onDrawFrame(GL10 unused) {
if (VERBOSE) {
Log.d(TAG, "onDrawFrame tex=" + mTextureId);
}
mSurfaceTexture.updateTexImage();
mSurfaceTexture.getTransformMatrix(mSTMatrix);
byteBuffer.rewind();
GLES20.glReadPixels(0, 0, mWidth, mHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
mat.put(0, 0, byteBuffer.array());
if (mCascadeClassifier != null) {
mFaces.empty();
mCascadeClassifier.detectMultiScale(mat, mFaces);
Log.d(TAG, "No. of faces detected : " + mFaces.toArray().length);
}
drawFrame(mTextureId, mSTMatrix);
}
我的mat对象初始化为相机预览宽度和高度:
mat = new Mat(height, width, CvType.CV_8UC3);
日志返回0面部检测。我有两个问题:
答案 0 :(得分:2)
在您渲染任何内容之前,您正在GLES帧缓冲区上调用drawFrame()
。如果您希望回读SurfaceTexture渲染,则需要在glReadPixels()
之后执行此操作。您可能需要考虑将屏幕外的纹理渲染为pbuffer EGLSurface,然后从中回读。
有几种不同的方法可以从相机获取像素数据:
<local:UC Test="{Binding SelectedString, Mode=OneWay}"/>
读取RGB数据(我相信您正在尝试这样做)。这通常非常快,但在某些设备和Android版本上,它可能会很慢。