AVCaptureVideoPreviewLayer не обнаруживает объекты в двух диапазонах экрана - PullRequest
0 голосов
/ 22 февраля 2020

Я скачал проект Apple о распознавании объектов в Live Capture. Когда я попробовал приложение, я увидел, что, если поместить объект для распознавания сверху или снизу обзора камеры, приложение не распознает объект:

На этом первом изображении банан находится в центр обзора камеры и приложение может его распознать.

объект изображения в центре

На этих двух изображениях банан находится вблизи границы обзора камеры и он не может распознать объект.

объект изображения сверху

объект изображения снизу

Это как установлены session и previewLayer:

 func setupAVCapture() {
    var deviceInput: AVCaptureDeviceInput!

    // Select a video device, make an input
    let videoDevice = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back).devices.first
    do {
        deviceInput = try AVCaptureDeviceInput(device: videoDevice!)
    } catch {
        print("Could not create video device input: \(error)")
        return
    }

    session.beginConfiguration()
    session.sessionPreset = .vga640x480 // Model image size is smaller.

    // Add a video input
    guard session.canAddInput(deviceInput) else {
        print("Could not add video device input to the session")
        session.commitConfiguration()
        return
    }
    session.addInput(deviceInput)
    if session.canAddOutput(videoDataOutput) {
        session.addOutput(videoDataOutput)
        // Add a video data output
        videoDataOutput.alwaysDiscardsLateVideoFrames = true
        videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)]
        videoDataOutput.setSampleBufferDelegate(self, queue: videoDataOutputQueue)
    } else {
        print("Could not add video data output to the session")
        session.commitConfiguration()
        return
    }
    let captureConnection = videoDataOutput.connection(with: .video)
    // Always process the frames
    captureConnection?.isEnabled = true
    do {
        try  videoDevice!.lockForConfiguration()
        let dimensions = CMVideoFormatDescriptionGetDimensions((videoDevice?.activeFormat.formatDescription)!)
        bufferSize.width = CGFloat(dimensions.width)
        bufferSize.height = CGFloat(dimensions.height)
        videoDevice!.unlockForConfiguration()
    } catch {
        print(error)
    }
    session.commitConfiguration()
    previewLayer = AVCaptureVideoPreviewLayer(session: session)
    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    rootLayer = previewView.layer
    previewLayer.frame = rootLayer.bounds
    rootLayer.addSublayer(previewLayer)
}

Вы можете скачать проект здесь , мне интересно, нормально это или нет.

Есть какие-нибудь решения, чтобы исправить? Требуются ли квадратные фотографии для разработки с coreml, и эти два диапазона не включены? Есть намеки? Спасибо

1 Ответ

2 голосов
/ 22 февраля 2020

Это, вероятно, потому что imageCropAndScaleOption установлен на centerCrop.

Модель Core ML ожидает квадратное изображение, но видеокадры не квадратные. Это можно исправить, установив параметр imageCropAndScaleOption на VNCoreMLRequest. Тем не менее, результаты могут быть не такими хорошими, как при центральном кадрировании (это зависит от того, как модель была изначально обучена).

См. Также VNImageCropAndScaleOption в документации Apple.

...