VNRectangleObservation углы сжаты по оси X на iPhone - PullRequest
0 голосов
/ 09 октября 2018

Я снимаю видео с камеры моего устройства и передаю его в каркас Vision для обнаружения прямоугольника.Код выглядит примерно так (сжато для краткости ... скрытые строки, не относящиеся к этому вопросу):

func captureOutput(_ output: AVCaptureOutput, 
                     didOutput sampleBuffer: 
                     CMSampleBuffer, from connection: AVCaptureConnection) {

    // Get a CIImage from the buffer
    guard let buffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
    let image = CIImage(cvImageBuffer: buffer)

    // Set up corner detector
    let handler = VNImageRequestHandler(ciImage: image, orientation: .up options: [:])
    let request = VNDetectRectanglesRequest()

    // Perform corner detection
    do {
            try handler.perform([request])
            guard let observation = request.results?.first as? VNRectangleObservation else {
                print("error at \(#line)")
                return
            }
            handleCorners(observation)
        } catch {
            print("Error: \(error)")
            return
        }
}

Это отлично работает на iPad Air 2, и я могу использовать углы в observation объект, чтобы нарисовать хорошее наложение.Но на iPhone X углы по оси X «сжаты».

Например, если я сделаю снимок с визитной карточкой, занимающей почти всю ширину экрана, я бы ожидал, что observation.topLeft будет иметь значение x, близкое к нулю.Вместо этого это почти 0,15.Это верно и для правых углов (ожидаемое: ~ 1,0, фактическое: ~ 0,85).

Есть идеи, почему это так?Свойство CIImage extent одинаково на обоих устройствах.Просто углы Vision сжаты по оси X.

1 Ответ

0 голосов
/ 06 февраля 2019

У меня была довольно похожая проблема с обнаружением прямоугольников в реальном времени с использованием ARKit.И после некоторого исследования я увидел этот ответ и выяснил, что: «Проблема в том, что ARKit предоставляет буфер изображения (frame.capturedImage) с разрешением камеры 1920 x 1440. Экран iPhone X375 х 812 баллов. Похоже, ARKit может видеть больше, чем может отображать на экране телефона ".Поэтому я просто исправил размер захваченного изображения, используя пропорции экрана, и это «решение» решило мою проблему.

...