Почему каркас 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.
Я использую ваш составной способ.