Набор Firebase ML смещен ограничительной рамкой - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь использовать новый Обнаружение и отслеживание объектов с помощью ML Kit на iOS, однако я, похоже, наталкиваюсь на контрольно-пропускной пункт с ограничивающей рамкой обнаружения объектов.

На примере фигуры le go в соответствии с документацией ориентация изображения всегда преобразуется в .up, однако ограничивающая рамка, кажется, почти повернута на 90 градусов до правильных размеров, несмотря на изображение ориентация правильная. Такое же поведение существует и в других объектах со смещением блока.

let options = VisionObjectDetectorOptions()
    options.detectorMode = .singleImage
    options.shouldEnableMultipleObjects = false

    let objectDetector = Vision.vision().objectDetector(options: options)

    let image = VisionImage(image: self.originalImage)

    objectDetector.process(image) { detectedObjects, error in
      guard error == nil else {
        print(error)
        return
      }
      guard let detectedObjects = detectedObjects, !detectedObjects.isEmpty else {
        print("No objects detected")
        return
      }


        let primaryObject = detectedObjects.first

        print(primaryObject as Any)

        guard let objectFrame = primaryObject?.frame else{return}

        print(objectFrame)

        self.imageView.image = self.drawOccurrencesOnImage([objectFrame], self.originalImage)

    }

и функцией, которая вызывает aws красное поле;

private func drawOccurrencesOnImage(_ occurrences: [CGRect], _ image: UIImage) -> UIImage? {
    let imageSize = image.size
    let scale: CGFloat = 0.0
    UIGraphicsBeginImageContextWithOptions(imageSize, false, scale)

    image.draw(at: CGPoint.zero)
    let ctx = UIGraphicsGetCurrentContext()

    ctx?.addRects(occurrences)
    ctx?.setStrokeColor(UIColor.red.cgColor)
    ctx?.setLineWidth(20)
    ctx?.strokePath()

    guard let drawnImage = UIGraphicsGetImageFromCurrentImageContext() else {
        return nil
    }

    UIGraphicsEndImageContext()
    return drawnImage
}

enter image description here

Размеры изображения согласно image.size равны (3024.0, 4032.0), а рамка рамки (1274.0, 569.0, 1299.0, 2023.0). Любое понимание этого поведения должно быть оценено.

1 Ответ

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

Закончилось неправильное масштабирование изображения, что вызвало смещение.

Эта функция исправила мои проблемы.

public func updateImageView(with image: UIImage) {
  let orientation = UIApplication.shared.statusBarOrientation
  var scaledImageWidth: CGFloat = 0.0
  var scaledImageHeight: CGFloat = 0.0
  switch orientation {
  case .portrait, .portraitUpsideDown, .unknown:
    scaledImageWidth = imageView.bounds.size.width
    scaledImageHeight = image.size.height * scaledImageWidth / image.size.width
  case .landscapeLeft, .landscapeRight:
    scaledImageWidth = image.size.width * scaledImageHeight / image.size.height
    scaledImageHeight = imageView.bounds.size.height
  }
  DispatchQueue.global(qos: .userInitiated).async {
    // Scale image while maintaining aspect ratio so it displays better in the UIImageView.
    var scaledImage = image.scaledImage(
      with: CGSize(width: scaledImageWidth, height: scaledImageHeight)
    )
    scaledImage = scaledImage ?? image
    guard let finalImage = scaledImage else { return }
    DispatchQueue.main.async {
      self.imageView.image = finalImage
      self.processImage(finalImage)
    }
  }
}
...