如何从成功的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
的Vision请求,并且想要提取由这些观察结果标识的主题图像区域?也许也透视投影它们,以使它们在像平面中是矩形的? (此in the Vision session from WWDC17的演示)。
您可以使用Core Image中的 CIPerspectiveCorrection
过滤器提取和校正区域。要进行设置,您需要传递来自图像观察的点,并将其转换为像素坐标。看起来像这样:
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),
])
}
现在,您将获得一个
CIImage
对象-这些对象本身并不是真正可显示的图像,而只是有关如何处理和显示图像的说明,可以用许多不同的方式来完成这些操作。显示图像的许多方法都涉及 CIContext
-您可以将其渲染到另一个像素缓冲区中,或者如果要尝试实时执行此处理,则可以渲染成Metal纹理-但不是全部。另一方面,如果您只是不太频繁地显示静态图像,则可以create a UIImage directly from the CIImage并将其显示在UIImageView
中,UIKit将管理底层的CIContext
和渲染过程。关于ios - 如何在Apple Vision框架中拍摄检测到的矩形的照片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48170950/