VNDetectRectanglesRequest обнаруживает только один прямоугольник на изображении с двумя прямоугольниками - Vision, Swift - PullRequest
2 голосов
/ 14 марта 2019

Я использую следующее для обнаружения прямоугольников на этом изображении: https://richardzhaodesign.files.wordpress.com/2015/02/order-final.jpg?w=300&h=300

import UIKit
import Vision

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    guard let image = UIImage(named: "sample2") else { return }

    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFit
    let scaledHeight = view.frame.width / image.size.width * image.size.height
    imageView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: scaledHeight)
    imageView.backgroundColor = .blue

    view.addSubview(imageView)

    let request = VNDetectRectanglesRequest { (req, err) in

        if let err = err {
            print("Failed to detect faces:", err)
            return
        }

        req.results?.forEach({ (res) in
            print("one")
            DispatchQueue.main.async {
                guard let rectangleObservation = res as? VNRectangleObservation else { return }

                let x = self.view.frame.width * rectangleObservation.boundingBox.origin.x
                let height = scaledHeight * rectangleObservation.boundingBox.height
                let y = scaledHeight * (1 -  rectangleObservation.boundingBox.origin.y) - height
                let width = self.view.frame.width * rectangleObservation.boundingBox.width

                let redView = UIView()
                redView.layer.borderColor = UIColor.red.cgColor
                redView.layer.borderWidth = 5
                redView.frame = CGRect(x: x, y: y, width: width, height: height)
                self.view.addSubview(redView)

            }
        })
    }

    guard let cgImage = image.cgImage else { return }

    DispatchQueue.global(qos: .background).async {
        let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
        do {
            try handler.perform([request])
        } catch let reqErr {
            print("Failed to perform request:", reqErr)
        }
    }

}
}

Мой вопрос заключается в том, почему это не распознает два квадрата.Я видел, как другие коды распознают несколько прямоугольников, но мой всегда распознает только один.Я уверен, что это не значит, что платформа Vision не способна распознавать другую с высокой точностью, просто я что-то упускаю в своем коде.Спасибо тебе.

1 Ответ

2 голосов
/ 15 марта 2019

Вы должны установить свойство MaximumObservations вашего VNDetectRectanglesRequest.Значение по умолчанию равно 1, поэтому вы получаете только 1 результат.

Например:

    let request = VNDetectRectanglesRequest { (req, err) in
        // Your completion handler code
    }

    request.maximumObservations = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...