当前位置: 首页 > 知识库问答 >
问题:

如何强制Android摄像头以纵向模式显示,或让我进行旋转

宣俊豪
2023-03-14

我是新来发帖的,所以请友善些!我已经研究了几乎所有其他与此相关的问题,并尝试了大多数,但我完全感到沮丧。我只想让我的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教程3代码和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中的某些东西可以工作?

一些人发布了关于使用“转置”和“翻转”函数旋转图像的帖子,我尝试了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度并再次显示视频,现在翻转,但仍然是横向模式:

    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之前,是否还有其他地方可以尝试进行图像旋转?是否有其他方法可以简单地强制相机以纵向模式提供帧?

共有1个答案

冀景明
2023-03-14

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

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

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

 类似资料:
  • 我正在使用(Android派)AOSP相机2应用程序。( 我们使用的是OV5640摄像头模块。能够在反向横向模式下预览和捕获图像和视频(但启用镜像)。但对于机械外壳配件,摄像头传感器模块在物理上向右旋转90度。在用于预览的摄像头应用程序中,图像将以90度左移的方式出现,同时启用了镜像功能。即使在拍摄完图像或视频后,也会有同样的行为。 请你建议我在相机应用程序(包/应用程序/相机2)中需要做什么更改

  • 问题内容: 在张量流中,我想从随机角度旋转图像,以进行数据增强。但是我在tf.image模块中找不到这种转换。 问题答案: 更新 :请参阅下面的@astromme答案。Tensorflow现在支持本地旋转图像。 在Tensorflow中没有本机方法的情况下可以执行的操作是这样的:

  • 我试图控制Android相机在肖像应用程序中拍照,但是当我保存照片时,它是在风景中。我已经旋转图像90级与方法,但不工作。 然后我找到了这篇文章,但是是(未定义)。如果我抓住这个值并应用旋转值,也不起作用。 我如何在肖像中拍摄照片,并以良好的方向保存它?

  • 6.7.3 摄像头信息仿真以及显示 通过 Gazebo 模拟摄像头传感器,并在 Rviz 中显示摄像头数据。 实现流程: 摄像头仿真基本流程: 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加摄像头配置; 将此文件集成进xacro文件; 启动 Gazebo,使用 Rviz 显示摄像头信息。 1.Gazebo 仿真摄像头 1.1 新建 Xacro 文件,配置摄像头传感器信

  • 问题内容: 在我的相机应用中,您可以在前后相机之间切换。当我使用后置摄像头拍照时,照片与预览显示的一样。但是当我切换到前置摄像头时,图片是镜像的。我认为这与前置摄像头和后置摄像头处于横向模式有关。我已经尝试了几乎所有给定的答案。 如果有人可以向我指出正确的方向,那将真的有帮助。 问题答案: 我找到了答案,这样做没有帮助。我必须镜像生成的位图才能获得所需的结果。我使用Matrix方法来实现这一目标。

  • 我的意图是有一个方形相机预览。 我没有1:1比例的相机预览可用(我在Nexus 5模拟器中),所以我的最佳尺寸可用为640 x 480,所以为了适应正方形预览,我将SurfaceView尺寸设置为与纵横比相等,但将屏幕外的边距偏移一半,以在屏幕上只保留裁剪的正方形。表面视图本身的大小和偏移量是正确的,但是相机预览本身仍然在正方形内显示压缩后的预览,而不是以正确的纵横比部分地在屏幕外显示。 有什么想