【问题标题】:VNDetectRectanglesRequest Only Detects One Rectangle In Image With Two Rectangles - Vision, SwiftVNDetectRectanglesRequest 仅检测具有两个矩形的图像中的一个矩形 - Vision,Swift
【发布时间】:2019-08-05 21:08:02
【问题描述】:

我正在使用以下方法来检测此图像中的矩形: 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 框架不能高精度地识别另一个框架,只是我的代码中遗漏了一些东西。谢谢你。

【问题讨论】:

    标签: ios swift computer-vision vision


    【解决方案1】:

    您必须设置VNDetectRectanglesRequestmaximumObservations 属性。默认值为 1,这就是为什么您只会得到 1 个结果。

    例如:

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

    【讨论】:

    • 非常感谢!
    • 设置request.maximumObservations = 0,识别多个矩形
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2014-04-30
    • 2021-02-26
    • 2016-09-19
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多