Android Camera2帧水平反转

Android Camera2 frame horizontal inversion

我想水平反转来自 TextureViewSurface 对象的帧。我能做的是将转换矩阵设置为此 TextureView 实例,而我 postScalex 为 -1 为 y 为 1(保持不变),并且比 postTranslate dx 在视图的整个宽度上并保持 dy 不变 (0F).

但是当我在屏幕旋转关闭的情况下将设备旋转 90 度(水平)时出现问题:图像旋转了 180 度,当然,这很有意义,因为 xy 轴没有改变。

如何解决?是否有可能以这种方式使用翻译矩阵来解决这个问题?或者可能与 OpenGL ES 工具一起使用?

P.S.: 奇怪的是,与设备旋转本身相比,旋转完成了两倍,例如当我将设备旋转 90 度时 - 预览会旋转 180 度。

P.S.S.:我尝试使用 MatrixsetPolyToPoly 方法反转预览...并得到完全相同的结果。

P.S.S.S.:另外,使用 open gl 对模型和投影矩阵使用简单的缩放和旋转变换来实现目标,并且得到了完全相同的结果!

更新:

这些是描述前置摄像头默认行为的屏幕截图 - 默认情况下 HAL 应用帧反转,我看不懂文字;尽管如此,无论我是否旋转设备 - "frame orientation" 都没有改变:

这些是我应用时的屏幕截图,例如 Matrix.scaleM(modelMatrix, 0, -1F, 1F, 1F);,然后将此矩阵应用于进入顶点着色器的每个坐标,所以我现在可以阅读文本,因为我自己应用了反演,所以 HAL 的反演使用我的自定义反转将导致反转缺失,但是当我旋转我的设备时(当然,旋转时设备方向变化被禁用,这就是重点) - 我会看到自己颠倒过来,这当然是完美的感觉,因为设备的坐标系不会改变。尽管如此,我还是希望能够以某种方式避免设备旋转本身的图像旋转(就像在默认模式下 - 无论设备是否旋转 - 预览图像只是 "does not care"),并且仍然能够阅读文本(我的意思是,就像在纵向模式下一样)。

你 运行 你的测试是用前置还是后置摄像头?通常只有前置摄像头框需要水平翻转,后置摄像头不需要。

无论如何,如果您需要根据设备方向进行不同的转换,则需要 detect orientation changes in your Activity。当设备旋转时,相机本身不会做任何事情,无论您选择哪种变换方法,您都会得到相同的结果。

更新#2

我刚刚意识到,如果在正确的时间在管道中应用转换,这个问题是可以解决的。我将展示一个工作示例,它广泛使用 OpenGL,但我希望您能找到有用的东西。请参阅我在执行类似任务时写的 code fragment, it uses a vertex shader to transform the coordinates. In drawFrame() there's a call to getTransformMatrix(). Instead of performing this call, get a matrix from this method