从自定义视图缩放形状坐标以适应不同的屏幕尺寸

时间:2018-06-11 14:29:15

标签: android scaling object-detection camera-api

我正在使用相机预览实时检测对象,然后拍摄照片并将其显示在其他活动中,并且将在检测到的对象上绘制边界框(大多数情况下为多边形)。

我设法做到了,一切正常。现在,我正试图通过设置较小的相机预览尺寸并通过更改相机参数拍摄更大分辨率的照片来加快检测过程。但是我要获得的坐标必须缩放以匹配大图片尺寸。

就我而言:

  • 相机预览尺寸始终为: 640x480 (坐标与此尺寸相符)
  • 拍摄照片将使用接受的答案here中提到的方法选择尺寸。
  • 在大多数情况下,图片尺寸会非常大(在我的手机中 4260x3120 )并且我正在调整画布大小以使其适合屏幕

对于画布大小我正在使用它来获得屏幕分辨率:

public static int getScreenWidth() {
    return Resources.getSystem().getDisplayMetrics().widthPixels;
}

public static int getScreenHeight() {
    return Resources.getSystem().getDisplayMetrics().heightPixels;
}

我的xml文件如下所示:

<LinearLayout>
     ....
    <android.support.v7.widget.Toolbar
      ....
    </android.support.v7.widget.Toolbar>

      ....
    <FrameLayout
        android:id="@android:id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_marginBottom="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginTop="16dp">

        <packagename.CropImageView
            android:id="@+id/scannedImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            android:src="@mipmap/ic_launcher_round" />

    </FrameLayout>
</LinearLayout>

并在我的自定义视图类 CropImageView 中,我将四个坐标传递给 onDraw 方法,并在它们之间绘制路径

注意:我看到了几个关于大致相同主题的问题,但我无法与它们联系,因为我不能像我这样的用例。任何信息,帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

我需要做的就是在此之后找到YX的比例因子:

    scaleFactorY = (float) newWidth / oldWidth;
    scaleFactorX = (float) newHeight / oldHeight;

然后将坐标与这些因子相乘。此外,您需要确保保留图片的preview sizepicture sizecontainer具有相同的宽高比,否则您将获得错位的坐标。

要获得所需的宽高比,只需要执行此操作:width / height