Почему каркас Vision не может выровнять два изображения?

Я пытаюсь сделать два изображения с помощью камеры и выровнять их с помощью платформы iOS Vision:

func align(firstImage: CIImage, secondImage: CIImage) {
  let request = VNTranslationalImageRegistrationRequest(
      targetedCIImage: firstImage) {
    request, error in
    if error != nil {
      fatalError()
    }
    let observation = request.results!.first
        as! VNImageTranslationAlignmentObservation
    secondImage = secondImage.transformed(
        by: observation.alignmentTransform)
    let compositedImage = firstImage!.applyingFilter(
        "CIAdditionCompositing",
        parameters: ["inputBackgroundImage": secondImage])
    // Save the compositedImage to the photo library.
  }

  try! visionHandler.perform([request], on: secondImage)
}

let visionHandler = VNSequenceRequestHandler()

Но это приводит к очень неправильным изображениям:

Вы можете видеть, что я пробовал три разных типа сцен - крупный план, сцену в помещении и сцену на улице. Я пробовал больше сцен на открытом воздухе, и результат почти одинаковый у всех.

В худшем случае я ожидал небольшого смещения, но не такого полного смещения. Что не так?

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

Мой код композитинга работает правильно. Проблема только в Vision Framework. Если я уберу звонки на Vision framework, поставлю телефон со штатива, композиция работает отлично. Там нет смещения. Таким образом, проблема в концепции Vision.

Это на iPhone X.

Как заставить Vision Framework работать правильно? Могу ли я сказать ему использовать данные гироскопа, акселерометра и компаса для улучшения выравнивания?

2 ответа

посмотрите этот пример от MLBoy:

      let request = VNTranslationalImageRegistrationRequest(targetedCIImage: image2, options: [:])

let handler = VNImageRequestHandler(ciImage: image1, options: [:])
do {
try handler.perform([request])
} catch let error {
print(error)
}

guard let observation = request.results?.first as? VNImageTranslationAlignmentObservation else { return }
let alignmentTransform = observation.alignmentTransform

image2 = image2.transformed(by: alignmentTransform)
let compositedImage = image1.applyingFilter("CIAdditionCompositing", parameters: ["inputBackgroundImage": image2])

Вы должны установить secondImage как targetImage и выполнить обработчик с firstImage.

Я использую ваш составной способ.

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