ios - iOS 快速图像差异对比
问题描述
我正在寻找一种比较两帧视频的快速方法,并确定它们之间是否发生了很大变化。这将用于决定我是否应该向图像识别服务发送请求REST
,所以我不想继续发送它们,直到可能有一些不同的结果。类似的事情正在做Vuforia SDK
。我从一个Framebuffer
from开始ARKit
,我将它缩放到 640:480 并转换为RGB888 vBuffer_image
. 它可以只比较几个点,但它需要找出差异是否显着。我首先使用计算几个点之间的差异vDSP
功能,但这有一个缺点 - 如果我将相机稍微向左/向右移动,那么相同的点会有不同的图像部分,并且计算出的差异很大,即使没有什么真正的改变。我正在考虑使用histograms
,但我还没有测试这种方法。什么是最好的解决方案?它需要快速,它可以只比较较小版本的图像等。
我已经使用VNFeaturePointObservation
from测试了另一种方法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 上测试 - 正如预期的那样,这会导致相机预览时出现一些丢帧。所以我需要一个更快的算法
解决方案
推荐阅读
- c# - cv::VideoCapture 在 C# 项目中从 DLL 使用时不会打开文件或流
- swift - 在 Swift 中的同一个 VC 上点击按钮后,有没有办法显示以前隐藏在早期代码行中的 UI 元素?
- sql-server - 禁用目标数据库的自动填充以进行数据库还原
- android - Android 导航组件 - 如何导航到嵌套图中的其他 startDestination
- powershell - 保留数字字符 使用 PowerShell 将非数字字符复制到相邻列 CSV
- java - 如何为现有的 Logback 配置提供补充?
- sql - SQL Server:根据使用的 WHERE 条件,将数据类型 nvarchar 转换为数字时出错
- android - 如何在android中的其他布局之上显示布局
- python - 我想让python在这个计算器中识别“num1”和“num2”是否是数字,以便python可以通知你没有输入有效的东西
- git - 解决报告的合并冲突后,是否需要重复运行相同的合并命令?