如何强制Android相机以纵向模式显示,或者让我进行旋转

我是新来的,所以请你好! 我几乎看到了与此相关的所有其他问题并尝试了最多,但我完全感到沮丧。 我只想让我的Android手机以纵向模式显示相机,而不是风景。 我只是修改opencv提供的ImageManipulations示例。

我正在使用opencv 3.01,Android sdk 23版,Android Studio 2.0和带有Android版6.0.1的Nexus 5手机。 这是2016年4月28日,这几乎是所有东西的最新稳定版本。

我已经在AndroidManifest.xml文件中强制应用程序进入纵向模式:

android:screenOrientation="portrait" 

并且整个应用程序在纵向模式下正确显示,但显示的摄像机图像旋转90度。 换句话说,如果您将头部向左倾斜90度,您将看到合适的图像。 所以我需要将图像向右旋转。

我尝试使用opencv Tutorial3代码和setDisplayOrientation(90):

 public void setResolution(Size resolution) { disconnectCamera(); mMaxHeight = resolution.height; mMaxWidth = resolution.width; // mCamera.setDisplayOrientation(90); //* Crashes if placed here connectCamera(getWidth(), getHeight()); mCamera.setDisplayOrientation(90); //* Doesn't crash if here, but doesn't work either } 

那不起作用。 在任何情况下,本教程都使用在Android版本21中弃用的“camera”类,并替换为“camera2”类。 我没有更进一步,因为我想使用最新的API,但也许camera2中的东西可以工作?

有些人发布了使用“转置”和“翻转”function来旋转图像,我尝试在onCameraFrame方法中做了很多这样的事情:

原创,作品,但轮换:

  public Mat onCameraFrame(CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); ... do stuff to the image ... return rgba; 

图像显示变暗,我的FPS计算变为零(奇怪)::

  public Mat onCameraFrame(CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); // Rotate clockwise 90 degrees Core.transpose(rgba, rgba); Core.flip(rgba, rgba, 1); ... do stuff to the image ... return rgba; 

再次旋转180度和video显示,现在翻转,但仍然是横向模式:

  public Mat onCameraFrame(CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); // Rotate clockwise 90 degrees, then 90 degrees again Core.transpose(rgba, rgba); Core.flip(rgba, rgba, 1); Core.transpose(rgba, rgba); Core.flip(rgba, rgba, 1); ... do stuff to the image ... return rgba; 

因此,如果onCameraFrame返回与原始分辨率不同的Mat,则显示为空白。 关于onCameraFrame的文档是粗略的 – 所以,这是真的吗?

在调用onCameraFrame之前,我是否应该尝试进行此图像旋转? 还有另一种方法,我可以简单地强制相机以纵向模式提供框架吗?

setDisplayOrientation适用于相机的标准预览输出(直接连接到camear的SurfaceView或TextureView),但OpenCV位于此处,并且接收数据的方式不受setDisplayOrientation的影响。

转置将改变图像数组的尺寸,除非样本的其余部分知道如何处理这个,否则你会遇到问题。 您必须跟踪代码以查看有关缓冲区大小(例如,绘制到UI的输出缓冲区)的假设,并相应地更新它们,使其成为您插入转置点之后的转置大小。

理想情况下,有一些方法可以在OpenCV绘制的输出视图上设置方向,但我不太了解OpenCV的样本是否存在这样的控件。