Swift:从实时摄像机视图中裁剪检测到的对象

问题描述 投票:0回答:1

我正在相机视图中实时使用对象检测。该应用程序类似于苹果的Breakfast Finder Example

我想在边界框中裁剪检测到的对象,并在新的View Controller中将其显示为图像。例如,如下图所示,检测到的羊角面包处于实时相机视图中,而我只想从整个相机视图中裁剪羊角面包并显示在新的VC中。我该如何实现?

enter image description here

代码如下:

    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
    }
ios swift uiimage avfoundation cgimage
1个回答
0
投票

您可以使用Core Image(import CoreImage)裁剪图像并将其转换为UIImage

let croppedImage = CIImage(cvImageBuffer: imageBuffer).cropped(to: boundingBox)
return UIImage(ciImage: croppedImage)
© www.soinside.com 2019 - 2024. All rights reserved.