gpt4 book ai didi

ios - 如何在 Apple Vision 框架中拍摄检测到的矩形的照片

转载 作者:可可西里 更新时间:2023-11-01 06:23:57 27 4
gpt4 key购买 nike

如何从成功的 VNRectangleObservation 对象中拍照(获取 CIImage)?

我有一个正在运行的视频捕获 session ,在 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) 我进行处理,即

func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

do {
try handler.perform([request], on: pixelBuffer)
} catch {
print(error)
}
}

我应该将传递给处理程序的像素缓冲区保存在某个地方并在该缓冲区上进行操作吗?很遗憾我无法从观察对象访问图像作为属性:(

有什么想法吗?

最佳答案

因此,您正在使用生成 VNRectangleObservation 的视觉请求,并且您想提取由这些观察结果识别的主题图像区域?也许也对它们进行透视投影,使它们在图像平面上呈矩形? (有这个 in the Vision session from WWDC17 的演示。)

您可以使用 CIPerspectiveCorrection 提取和纠正该区域从 Core Image 过滤。要进行设置,您需要传递图像观察中的点,并将其转换为像素坐标。看起来像这样:

func extractPerspectiveRect(_ observation: VNRectangleObservation, from buffer: CVImageBuffer) -> CIImage {
// get the pixel buffer into Core Image
let ciImage = CIImage(cvImageBuffer: buffer)

// convert corners from normalized image coordinates to pixel coordinates
let topLeft = observation.topLeft.scaled(to: ciImage.extent.size)
let topRight = observation.topRight.scaled(to: ciImage.extent.size)
let bottomLeft = observation.bottomLeft.scaled(to: ciImage.extent.size)
let bottomRight = observation.bottomRight.scaled(to: ciImage.extent.size)

// pass those to the filter to extract/rectify the image
return ciImage.applyingFilter("CIPerspectiveCorrection", parameters: [
"inputTopLeft": CIVector(cgPoint: topLeft),
"inputTopRight": CIVector(cgPoint: topRight),
"inputBottomLeft": CIVector(cgPoint: bottomLeft),
"inputBottomRight": CIVector(cgPoint: bottomRight),
])
}

Aside: The scaled function above is a convenience extension on CGPoint to make coordinate math a bit smaller at the call site:

extension CGPoint {
func scaled(to size: CGSize) -> CGPoint {
return CGPoint(x: self.x * size.width,
y: self.y * size.height)
}
}

现在,这会让你得到一个 CIImage对象——它们本身并不是真正可显示的图像,只是关于如何处理和显示图像的说明,可以通过许多不同的可能方式来完成。许多显示图像的方法都涉及 CIContext — 您可以将其渲染到另一个像素缓冲区中,或者如果您尝试实时进行此处理,则可能渲染到金属纹理中 — 但不是全部。另一方面,如果您只是不太频繁地显示静态图像,则可以 create a UIImage directly from the CIImage并将其显示在 UIImageView 中,UIKit 将管理底层的 CIContext 和渲染过程。

关于ios - 如何在 Apple Vision 框架中拍摄检测到的矩形的照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48170950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com