15

我正在尝试使用相机拍摄两张图像,并使用 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框架有问题。如果我删除对 Vision 框架的调用,将电话放在三脚架上,则构图可以完美运行。没有错位。所以问题是Vision框架。

这是在 iPhone X 上。

如何让 Vision 框架正常工作?我可以告诉它使用陀螺仪、加速度计和指南针数据来改善对准吗?

4

2 回答 2

0

您应该将 secondImage 设置为 targetImage,并使用 firstImage 执行处理程序。

我用你的复合方式。

于 2020-09-26T22:07:09.097 回答
0

从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])

例子

于 2021-09-18T20:38:38.097 回答