Масштабировать координаты формы из пользовательского вида для адаптации к разным размерам экрана

Я работаю над приложением для обнаружения объектов в режиме реального времени с помощью предварительного просмотра камеры, а затем делаю снимок и отображаю его в другом упражнении, а поверх обнаруженного объекта будет нарисован ограничивающий прямоугольник (в большинстве случаев многоугольник).

Мне удалось это сделать, и все работает отлично. Сейчас я пытаюсь ускорить процесс обнаружения, установив небольшой размер предварительного просмотра камеры и сделав снимок с большим разрешением, изменив параметры камеры. Но координаты, которые я получу, должны быть масштабированы, чтобы соответствовать большому размеру изображения.

В моем случае:

  • Размер предварительного просмотра камеры всегда: 640x480 (координаты соответствуют этому размеру)
  • Сделанный снимок Размер будет выбран с использованием метода, указанного в принятом ответе здесь.
  • В большинстве случаев размер изображения будет таким большим (в моем телефоне это 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 ответ

Решение

Все, что мне нужно было сделать, это найти масштабные коэффициенты для Y а также X следуя этому:

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

затем умножьте координаты с этими факторами. Также вы должны убедиться, что preview size, picture size и container это будет держать изображение с таким же соотношением сторон, иначе вы получите неуместные координаты.

чтобы получить соотношение сторон, вам нужно просто сделать это: width / height,

Другие вопросы по тегам