Отслеживание нескольких объектов в iOS 13 - PullRequest
0 голосов
/ 04 октября 2019

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

Больше всего меня беспокоит то, что а) работают пейзажные видео, но не портретные видео и б)ошибка происходит только в реальных устройствах, а не в симуляторе. См. Прикрепленный фрагмент кода, используемый для отображения видео в зависимости от его пропорций (альбомная или книжная).

private func scaleImage(to viewSize: CGSize) -> UIImage? {
    guard self.image != nil && self.image.size != CGSize.zero else {
        return nil
    }

    self.imageAreaRect = CGRect.zero

    // There are two possible cases to fully fit self.image into the the ImageTrackingView area:
    // Option 1) image.width = view.width ==> image.height <= view.height
    // Option 2) image.height = view.height ==> image.width <= view.width
    let imageAspectRatio = self.image.size.width / self.image.size.height

    // Check if we're in Option 1) case and initialize self.imageAreaRect accordingly
    let imageSizeOption1 = CGSize(width: viewSize.width, height: floor(viewSize.width / imageAspectRatio))
    if imageSizeOption1.height <= viewSize.height {

        print("Landscape. View size: \(viewSize)")
        let imageX: CGFloat = 0
        let imageY = floor((viewSize.height - imageSizeOption1.height) / 2.0)
        self.imageAreaRect = CGRect(x: imageX,
                                    y: imageY,
                                    width: imageSizeOption1.width,
                                    height: imageSizeOption1.height)

    }

    if self.imageAreaRect == CGRect.zero {
        // Check if we're in Option 2) case if Option 1) didn't work out and initialize imageAreaRect accordingly

        print("portrait. View size: \(viewSize)")
        let imageSizeOption2 = CGSize(width: floor(viewSize.height * imageAspectRatio), height: viewSize.height)
        if imageSizeOption2.width <= viewSize.width {

            let imageX = floor((viewSize.width - imageSizeOption2.width) / 2.0)
            let imageY: CGFloat = 0
            self.imageAreaRect = CGRect(x: imageX,
                                        y: imageY,
                                        width: imageSizeOption2.width,
                                        height: imageSizeOption2.height)

        }
    }

    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
    // Pass 1.0 to force exact pixel size.
    UIGraphicsBeginImageContextWithOptions(self.imageAreaRect.size, false, 0.0)
    self.image.draw(in: CGRect(x: 0.0, y: 0.0, width: self.imageAreaRect.size.width, height: self.imageAreaRect.size.height))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

Любая помощь будет очень признательна.

Спасибо

1 Ответ

0 голосов
/ 09 октября 2019

после нескольких недель преследования технической поддержки Apple, они предложили очень простой обходной путь. По сути, вам просто нужно выполнить преобразование через CGImage вместо перехода непосредственно из CIImage в UIImage.

Это старый код (как вы можете видеть в текущем примере в документации Apple)

 if let frame = frame {
            let ciImage = CIImage(cvPixelBuffer: frame).transformed(by: transform)
            let uiImage = UIImage(ciImage: ciImage)
            self.trackingView.image = uiImage
        }

И это исправление

if let frame = frame {
            let ciImage = CIImage(cvPixelBuffer: frame).transformed(by: transform)
            guard let cgImage = CIContext.init().createCGImage(ciImage, from: ciImage.extent) else {
                return
            }
            let uiImage = UIImage(cgImage: cgImage)
            self.trackingView.image = uiImage
        }

Надеюсь, это поможет!

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