Перевести Firebase MLKit Координаты ограничивающего прямоугольника в координаты экрана - PullRequest
5 голосов
/ 27 февраля 2020

Я использую FirebaseVision Обнаружение объектов для обнаружения вещей из CameraX предварительного просмотра камеры. Это обнаруживает вещи, но я пытаюсь нарисовать ограничивающую рамку из предметов, обнаруженных в предпросмотре камеры. При этом ограничивающий прямоугольник, который возвращает firebase, предназначен не для самого изображения, а не для предварительного просмотра, поскольку они отображаются не в том месте.

Размер изображения, которое я получаю из firebase, равен 1200x1600, а предварительный просмотр размер 2425x1440

Как перевести ограничивающие прямоугольники, возвращенные из firebase, в правильные координаты экрана?

1 Ответ

0 голосов
/ 07 марта 2020

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

if(isPortraitMode()){
    _scaleY = overlayView.height.toFloat() / imageWidth.toFloat()
    _scaleX = overlayView.width.toFloat() / imageHeight.toFloat()
}else{
    _scaleY = overlayView.height.toFloat() / imageHeight.toFloat()
    _scaleX = overlayView.width.toFloat() / imageWidth.toFloat()
}

Теперь, когда у меня есть масштаб Затем я могу взять ограничивающий прямоугольник, возвращаемый детектором пожарной базы, и перевести координаты x и y по шкалам

private fun translateX(x: Float): Float = x * _scaleX
private fun translateY(y: Float): Float = y * _scaleY

private fun translateRect(rect: Rect) = RectF(
    translateX(rect.left.toFloat()),
    translateY(rect.top.toFloat()),
    translateX(rect.right.toFloat()),
    translateY(rect.bottom.toFloat())
)

, которые затем дают вам масштабированные прямоугольные координаты, которые вы затем рисуете на экране

...