Android Camera2帧水平反转
Android Camera2 frame horizontal inversion
我想水平反转来自 TextureView
的 Surface
对象的帧。我能做的是将转换矩阵设置为此 TextureView
实例,而我 postScale
为 x
为 -1 为 y
为 1(保持不变),并且比 postTranslate
dx
在视图的整个宽度上并保持 dy
不变 (0F
).
但是当我在屏幕旋转关闭的情况下将设备旋转 90 度(水平)时出现问题:图像旋转了 180 度,当然,这很有意义,因为 x
和y
轴没有改变。
如何解决?是否有可能以这种方式使用翻译矩阵来解决这个问题?或者可能与 OpenGL ES 工具一起使用?
P.S.: 奇怪的是,与设备旋转本身相比,旋转完成了两倍,例如当我将设备旋转 90 度时 - 预览会旋转 180 度。
P.S.S.:我尝试使用 Matrix
的 setPolyToPoly
方法反转预览...并得到完全相同的结果。
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。
我想水平反转来自 TextureView
的 Surface
对象的帧。我能做的是将转换矩阵设置为此 TextureView
实例,而我 postScale
为 x
为 -1 为 y
为 1(保持不变),并且比 postTranslate
dx
在视图的整个宽度上并保持 dy
不变 (0F
).
但是当我在屏幕旋转关闭的情况下将设备旋转 90 度(水平)时出现问题:图像旋转了 180 度,当然,这很有意义,因为 x
和y
轴没有改变。
如何解决?是否有可能以这种方式使用翻译矩阵来解决这个问题?或者可能与 OpenGL ES 工具一起使用?
P.S.: 奇怪的是,与设备旋转本身相比,旋转完成了两倍,例如当我将设备旋转 90 度时 - 预览会旋转 180 度。
P.S.S.:我尝试使用 Matrix
的 setPolyToPoly
方法反转预览...并得到完全相同的结果。
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。