Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import SwiftUI
- import AVFoundation
- import Vision
- class CameraViewModel: NSObject, ObservableObject {
- @Published var detectedRects: [CGRect] = []
- private let session = AVCaptureSession()
- private var videoOutput = AVCaptureVideoDataOutput()
- private var visionRequest = VNDetectRectanglesRequest()
- override init() {
- super.init()
- setupSession()
- setupVision()
- }
- func setupSession() {
- guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
- session.beginConfiguration()
- // Set up input
- if let input = try? AVCaptureDeviceInput(device: captureDevice), session.canAddInput(input) {
- session.addInput(input)
- }
- // Set up output
- videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "camera.frame.processing"))
- if session.canAddOutput(videoOutput) {
- session.addOutput(videoOutput)
- }
- session.commitConfiguration()
- }
- func setupVision() {
- visionRequest.minimumAspectRatio = 1.58 / 1.0
- visionRequest.maximumAspectRatio = 1.6 / 1.0
- visionRequest.minimumSize = 0.2 // Minimum size as a fraction of the image
- visionRequest.maximumObservations = 1
- visionRequest.quadratureTolerance = 45.0
- }
- func startSession() {
- session.startRunning()
- }
- func stopSession() {
- session.stopRunning()
- }
- }
- extension CameraViewModel: AVCaptureVideoDataOutputSampleBufferDelegate {
- func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
- guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
- let requestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
- do {
- try requestHandler.perform([visionRequest])
- if let results = visionRequest.results as? [VNRectangleObservation] {
- DispatchQueue.main.async {
- self.detectedRects = results.map { observation in
- CGRect(
- x: observation.boundingBox.origin.x,
- y: 1 - observation.boundingBox.origin.y - observation.boundingBox.size.height,
- width: observation.boundingBox.size.width,
- height: observation.boundingBox.size.height
- )
- }
- }
- }
- } catch {
- print("Error performing vision request: \(error)")
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement