首页 > 解决方案 > iOS 快速图像差异对比

问题描述

我正在寻找一种比较两帧视频的快速方法,并确定它们之间是否发生了很大变化。这将用于决定我是否应该向图像识别服务发送请求REST,所以我不想继续发送它们,直到可能有一些不同的结果。类似的事情正在做Vuforia SDK。我从一个Framebufferfrom开始ARKit,我将它缩放到 640:480 并转换为RGB888 vBuffer_image. 它可以只比较几个点,但它需要找出差异是否显着。我首先使用计算几个点之间的差异vDSP功能,但这有一个缺点 - 如果我将相机稍微向左/向右移动,那么相同的点会有不同的图像部分,并且计算出的差异很大,即使没有什么真正的改变。我正在考虑使用histograms,但我还没有测试这种方法。什么是最好的解决方案?它需要快速,它可以只比较较小版本的图像等。

我已经使用VNFeaturePointObservationfrom测试了另一种方法Vision。这效果要好得多,但恐怕它可能对 CPU 要求更高。我需要在一些旧设备上对此进行测试。无论如何,这是运行良好的代码的一部分。如果有人可以建议一些更好的测试方法,请告知:

    private var lastScanningImageFingerprint: VNFeaturePrintObservation?
    
    // Returns true if these are different enough
    private func compareScanningImages(current: VNFeaturePrintObservation, last: VNFeaturePrintObservation?) -> Bool {
        guard let last = last else { return true }
        var distance = Float(0)
        try! last.computeDistance(&distance, to: current)
        print(distance)
        return distance > 10
    }
    
    // After scanning is done, subclass should prepare suggestedTargets array.
    private func performScanningIfNeeded(_ sender: Timer) {
        guard !scanningInProgress else { return } // Wait for previous scanning to finish
        guard let vImageBuffer = deletate?.currentFrameScalledImage else { return }
        guard let image = CGImage.create(from: vImageBuffer) else { return }
        
        func featureprintObservationForImage(image: CGImage) -> VNFeaturePrintObservation? {
            let requestHandler = VNImageRequestHandler(cgImage: image, options: [:])
            let request = VNGenerateImageFeaturePrintRequest()
            do {
                try requestHandler.perform([request])
                return request.results?.first as? VNFeaturePrintObservation
            } catch {
                print("Vision error: \(error)")
                return nil
            }
        }
        
        guard let imageFingerprint = featureprintObservationForImage(image: image) else { return }
        guard compareScanningImages(current: imageFingerprint, last: lastScanningImageFingerprint) else { return }
        print("SCANN \(Date())")
        lastScanningImageFingerprint = featureprintObservationForImage(image: image)
        executeScanning(on: image) { [weak self] in
            self?.scanningInProgress = false
        }
    }

在较旧的 iPhone 上测试 - 正如预期的那样,这会导致相机预览时出现一些丢帧。所以我需要一个更快的算法

标签: iosswiftimage-processingaugmented-realityvdsp

解决方案


推荐阅读