我正在相机视图中实时使用对象检测。该应用程序类似于苹果的Breakfast Finder Example
我想在边界框中裁剪检测到的对象,并在新的View Controller中将其显示为图像。例如,如下图所示,检测到的羊角面包处于实时相机视图中,而我只想从整个相机视图中裁剪羊角面包并显示在新的VC中。我该如何实现?
代码如下:
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
detect(cVImageBuffer: pixelBuffer)
//Some code .....
let image = cropDetectedObject(imageBuffer: pixelBuffer, boundingBox: self.boundingBox)
}
func detect(cVImageBuffer: CVImageBuffer) {
guard let model = try? VNCoreMLModel(for: model.model) else {
fatalError("can't load model")
}
let width = CVPixelBufferGetWidth(cVImageBuffer)
let height = CVPixelBufferGetHeight(cVImageBuffer)
let imageSize = CGSize(width: width, height: height)
let request = VNCoreMLRequest(model: model) { [unowned self] request, error in
DispatchQueue.main.async(execute: {
if let results = request.results {
self.drawBoundingBox(results, imageSize: imageSize)
}
})
}
let handler = VNImageRequestHandler(cvPixelBuffer: cVImageBuffer, orientation: .up, options: [:])
DispatchQueue.global(qos: .userInteractive).async {
do {
try handler.perform([request])
} catch {
print(error)
}
}
}
func drawBoundingBox(_ results: [Any], imageSize: CGSize) {
// Some code goes here.....
for observation in results where observation is VNRecognizedObjectObservation {
guard let objectObservation = observation as? VNRecognizedObjectObservation else {
continue
}
let topLabelObservation = objectObservation.labels[0]
let objectBounds = VNImageRectForNormalizedRect(objectObservation.boundingBox, 0, 0)
self.boundingBox = objectBounds
}
}
}
func cropDetectedObject(imageBuffer: CVImageBuffer, boundingBox: CGRect) -> UIImage? {
guard let cvImageBuffer = imageBuffer else { return nil }
// Cropping Image Code should be here
}
您可以使用Core Image(import CoreImage
)裁剪图像并将其转换为UIImage
:
let croppedImage = CIImage(cvImageBuffer: imageBuffer).cropped(to: boundingBox)
return UIImage(ciImage: croppedImage)