Размер предварительного просмотра для сканера штрих-кода из Vision api

Я использую пример считывателя штрих-кода из Google Android Vision API. Размер предварительного просмотра, похоже, не заполняет все доступное пространство (я использую Nexus 4, и справа от предварительного просмотра есть белое неиспользуемое пространство, примерно 1/3 ширины).

Я хотел бы иметь возможность запускать этот пример на различных устройствах и всегда, чтобы он занимал все доступное пространство.

Итак, бит, с которым я играл, это:

CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector).setFacing(CameraSource.CAMERA_FACING_BACK).setRequestedPreviewSize(?, ?).setRequestedFps(15.0f);

Любые идеи?

Спасибо!


person mmagician    schedule 07.10.2015    source источник
comment
У меня такая же проблема. пожалуйста, предоставьте решение. Я уже просмотрел потоки github, но не мог понять, как ограничить область обнаружения.   -  person Madhu    schedule 21.02.2018


Ответы (2)


просто удалите или прокомментируйте код ниже из класса CameraSourcePreview

if (childHeight > layoutHeight) {
    childHeight = layoutHeight;
    childWidth = (int)(((float) layoutHeight / (float) height) * width);
}

и используйте layoutHeight вместо childHeight класса CameraSourcePreview в этом цикле - for (int i = 0; i ‹getChildCount (); ++ i) {...}

if (mCameraSource != null)
    {
        Size size = mCameraSource.getPreviewSize();
        if (size != null)
        {
            width = size.getWidth();
            height = size.getHeight();
        }
    }

    // Swap width and height sizes when in portrait, since it will be rotated 90 degrees
    if (isPortraitMode())
    {
        int tmp = width;

        //noinspection SuspiciousNameCombination
        width = height;
        height = tmp;
    }

    final int layoutWidth = right - left;
    final int layoutHeight = bottom - top;

    // Computes height and width for potentially doing fit width.
    int childWidth = layoutWidth;
    int childHeight = (int) (((float) layoutWidth / (float) width) * height);

    for (int i = 0; i < getChildCount(); ++i)
    {
        getChildAt(i).layout(0, 0, childWidth, layoutHeight);
    }

    try
    {
        startIfReady();
    }
    catch (SecurityException se)
    {
        Log.e(TAG, "Do not have permission to start the camera", se);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Could not start camera source.", e);
    }
}
person Akash Dubey    schedule 08.12.2015
comment
Хотя технически это работает, у меня есть два замечания. 1: сейчас вы используете только layoutWidth и layoutHeight, вы можете вырезать большую часть кода. 2: этот метод растягивает видео, он НЕ сохраняет соотношение сторон. - person Reinstate Monica; 17.02.2017
comment
Я исправил это, установив размер предварительного просмотра камеры как в соотношении, потому что мне нужен меньший размер предварительного просмотра камеры. - person Akash Dubey; 17.02.2017
comment
Куда именно я должен добавить этот код? - person Andrei Manolache; 11.05.2021
comment
В классе CameraSourcePreview найдите указанное выше условие if и замените его указанным кодом. - person Akash Dubey; 12.05.2021

Есть два способа заставить изображение с камеры заполнять весь экран.

  1. Ответ Акеша Дубея, в котором отображается все изображение, растягивая его до размеров ширины и высоты макета. Однако соотношение сторон не сохраняется.
  2. Мой ответ ниже, который обрезает изображение, чтобы оно соответствовало без ущерба для соотношения сторон.

Чтобы обрезать изображение, все, что вам нужно сделать, это заменить один > на <. Найдите приведенный ниже оператор if и измените условие следующим образом:

if (childHeight < layoutHeight) {
    childHeight = layoutHeight;
    childWidth = (int)(((float) layoutHeight / (float) height) * width);
}
person Reinstate Monica    schedule 17.02.2017
comment
Это сработало! Большое спасибо!! - person ManiKandan Selvanathan; 20.07.2017
comment
Ваше решение НАМНОГО лучше, чем любое другое, которое я видел (и намного проще ...). В любом случае у нас все еще есть проблема (растягивание или обрезка), но в случае сканера QR-кода, я бы сказал, обрезка намного лучше. - person Keysaw; 22.02.2018